Hello. I have a little problem and can not solve it.

I am working in an exercise which adds 1 and Subtract 1 ( two different threads ).

Basically the output must be something like 0, 1, 2, 3, 2, 3, 4, 3, 4, 5, 6, 5 ,6, 7 ........................

Here is all of my classes. Please help me i am stuck !!!!!!!!!
Java Code:
public class Main{
	public static void main(String[] args){
		
		Storage storage = new Storage();
		
		Printer printer = new Printer(storage);
		Adder adder = new Adder(storage);
		Subtracter subtracter = new Subtracter(storage);

		Thread printerThread = new Thread(printer, "Printer");
		Thread adderThread = new Thread(adder, "Adder");
		Thread subtracterThread = new Thread(subtracter, "Subtracter");

		printerThread.start();
		adderThread.start();
		subtracterThread.start();

	}
}
Java Code:
public class Storage{
	
	private int number = 0;
	
	Storage(){
		
	}
	
	Storage(int number){
		this.number = number;
	}
	
	
	public synchronized void addNumber(int value){
		while(true){
			try{
				wait(250);
			}catch(InterruptedException e){
				
			}
			this.number = this.number + value;
			notifyAll();
			
			
		}
	}
	
	public synchronized void subNumber(int value){
		while(true){
			try{
				wait(500);
			}catch(InterruptedException e){
				
			}
			this.number = this.number - value;
			notifyAll();
			
		}
	}
	
	public synchronized void printSum(){
		while(true){
			try{
				wait(250);
			}catch(InterruptedException e){
				
			}
			System.out.println(this.number);
			notifyAll();
			
		}
	}
}
Java Code:
public class Adder implements Runnable {
	
	Storage number;
	private int add = 1;
	
	Adder(){
		
	}
		
	Adder(Storage number){
		this.number = number;
	}
		
	public void run(){
		while(true){
			try {
				number.addNumber(add);
				Thread.sleep(250);
			} catch (InterruptedException e) {
				
			}
		}
	}
}
Java Code:
public class Subtracter implements Runnable {
	
	Storage number;
	private int sub = 1;
	
	Subtracter(){
		
	}
	
	Subtracter(Storage number){
		this.number = number;
	}
	
	public void run(){
		while(true){
			try {
				number.subNumber(sub);
				Thread.sleep(500);
			} catch (InterruptedException e) {
				
			}
		}
	}
}
Java Code:
public class Printer implements Runnable {
	Storage number = new Storage();
	
	
	Printer(){
		
	}
	
	
	Printer(Storage number){
		this.number = number;
	}
	
	
	public synchronized void run() {
		while(true){
			try {
				//System.out.println(number.printSum());
				number.printSum();
				Thread.sleep(250);
					
					
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}
Thanks