22. Two Threads Run Sequentially Program - prabhatrocks07/Core-Java-Programming GitHub Wiki

public class PrintEvenOddTester {

public static void main(String[] args) {
	Printer printer = new Printer();
	Thread t1 = new Thread(new TaskEvenOdd(10, printer, false));
	Thread t2 = new Thread(new TaskEvenOdd(10, printer, true));
	t1.start();
	t2.start();
}
}

class TaskEvenOdd implements Runnable {

private int max;
private Printer printer;
private boolean isEvenNumber;

public TaskEvenOdd(int max, Printer printer, boolean isEvenNumber) {
	super();
	this.max = max;
	this.printer = printer;
	this.isEvenNumber = isEvenNumber;
}

@Override
public void run() {
	
	int number = isEvenNumber ? 2 : 1;
	while(number <= max) {
		if(isEvenNumber) {
			printer.printEven(number);
		} else {
			printer.printOdd(number);
		}
		
		number += 2;
	}
}

}

class Printer {

boolean isOdd;

synchronized void printEven(int number) {
	while(!isOdd) {
		try {
			wait();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	System.out.println("Even : " + number);
	isOdd = false;
	notifyAll();
}

synchronized void printOdd(int number) {
	while(isOdd) {
		try {
			wait();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	System.out.println("Odd : " + number);
	isOdd = true;
	notifyAll();
}

}