I'm trying to do a small exercise to get used to wait/notify. What i'm trying to do is simply start a thread, then put it to sleep with wait and wake it up with notify, multiple times.
My code is:
public class Simple{
static final Thread mainThread = Thread.currentThread();
public static void main(String[] args) throws InterruptedException {
PrintThread printer = new PrintThread(0);
printer.start();
synchronized (mainThread){
System.out.println("main sleeping while waiting for printer to be started");
mainThread.wait();
System.out.println("main woke up");
for (int i = 0; i < 1000; i++) {
synchronized (printer){
System.out.println("added num "+i);
printer.numToPrint = i;
System.out.println("main waking up printer");
printer.notifyAll();
System.out.println("main sleeping");
mainThread.wait();
System.out.println("main woke up");
}
}
}
}
}
class PrintThread extends Thread{
public int numToPrint = -1;
public PrintThread(int numToPrint){
this.numToPrint = numToPrint;
}
@Override
public synchronized void run() {
System.out.println("printer started");
while (true){
try {
synchronized (Simple.mainThread){
System.out.println("printer waking up main");
Simple.mainThread.notifyAll();
}
System.out.println("printer sleeping");
wait();
System.out.println("printer woke up");
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("printing num "+numToPrint);
}
}
}
I would expect this to go something like
main sleeping while waiting for printer to be started
printer started
printer waking up main
printer sleeping
main woke up
added num 0
main waking up printer
main sleeping
printer woke up
printing num 0
printer waking up main
printer sleeping
main woke up
added num 1
...
Instead this does:
main sleeping while waiting for printer to be started
printer started
printer waking up main
printer sleeping
main woke up
added num 0
main waking up printer
main sleeping
So... it seems like notify isn't waking up the printer thread?
It shouldn't be a deadlock since by waiting i realease all the locks i have, so the main shoudn't have any lock over printer and printer should be able to wake up and print.
What am i doing wrong?