In Java, you can use wait( ) and notifyAll( ) to communicate between threads. The code below demonstrates that:
Note: This a typical example of splitting tasks among threads. A method calls notify/notifyAll( ) as the last thing it does (besides return). Since the printOdd( ) and printEven( ) methods were void, the notifyAll( ) was the last statement. If it were to return some value, the notifyAll( ) would have been placed just before the return statement.
Firstly, create the thread classes and the main method that creates the thread and run it.
package multithreading;
public class NumberGenerator extends Thread {
private NumberUtility numberUtility;
private int maxNumber;
private boolean isEvenNumber;
public NumberGenerator(NumberUtility numberUtility, int maxNumber, boolean isEvenNumber) {
this.numberUtility = numberUtility;
this.maxNumber = maxNumber;
this.isEvenNumber = isEvenNumber;
}
public void run() {
int i = isEvenNumber == true ? 2 : 1;
while (i <= maxNumber) {
if(isEvenNumber == true) {
numberUtility.printEven(i);
}
else {
numberUtility.printOdd(i);
}
i = i + 2;
}
}
public static void main(String[] args) {
NumberUtility numUtility = new NumberUtility(); //<span id=”IL_AD6″ class=”IL_AD”>single</span> instance shared by oddGen and evenGen threads
final int MAX_NUM = 10;
//create 2 threads, one to generate odd numbers and the other to generate even numbers
NumberGenerator oddGen = new NumberGenerator(numUtility, MAX_NUM, false);
NumberGenerator evenGen = new NumberGenerator(numUtility, MAX_NUM, true);
oddGen.start(); //start the thread – invokes the run() method on NumberGenerator
evenGen.start(); //start the thread – invokes the run() method on NumberGenerator
}
}
Next, create the utility class that is used for communicating between the two threads with wait() and notifyAll() methods via synchronized methods.
package multithreading;
import static java.lang.System.out;
public class NumberUtility {
boolean oddPrinted = false;
public synchronized void printOdd(int number) {
while (oddPrinted == true) {
try {
wait(); // waits until notified by even thread
} catch (InterruptedException e) {
e.printStackTrace();
}
}
out.println(“printOdd() ” + number);
oddPrinted = true;
notifyAll(); //notify all waiting threads
}
public synchronized void printEven(int number) {
while (oddPrinted == false) {
try {
wait(); //waits until notified by the odd thread
} catch (InterruptedException e) {
}
}
oddPrinted = false;
out.println(“printEven() ” + number);
notifyAll(); //notify all waiting threads
}
}
The output will be something like:
printOdd() 1
printEven() 2
printOdd() 3
printEven() 4
printOdd() 5
printEven() 6
printOdd() 7
printEven() 8
printOdd() 9
printEven() 10