A simple wait notify example

Posted by {"name"=>"Palash Ray", "email"=>"paawak@gmail.com", "url"=>"https://www.linkedin.com/in/palash-ray/"} on April 17, 2009 · 1 min read

At times we often need to fetch an object which might take a long time. Our preferred way of doing that, especially when we are on a UI thread, is to spawn a different thread so as to keep the UI responsive (this is just one of the many use cases that I can think of now). But since we need that object to proceed further in the current execution, we have to resort to some sort of wait/notify mechanism. The following code demoes a very simplistic approach using the regular wait()/notify().

package com.swayam.thread.test;
/**
 *
 * @author paawak
 *
 */
public class WaitNotifyExample {
    private Object lock = new Object();
    public WaitNotifyExample() {
    }
    public void runLongTask() {
        Thread job = new Thread(new Runnable() {
            public void run() {
                System.out.println("Long task started");
                try {
                    int maxCount = 1000;
                    // int maxCount = Integer.MAX_VALUE;
                    // do some long task
                    for (int i = 0; i < maxCount; i++) {
                        System.out.println(i);
                    }
                    System.out.println("Long task done.");
                } finally {
                    System.out.println("About to notify lock...");
                    synchronized (lock) {
                        lock.notifyAll();
                    }
                    System.out.println("Lock notified");
                }
            }
        });
        // job.setPriority(Thread.MAX_PRIORITY - 2);
        System.out.println("Starting a long task...");
        job.start();
        System.out
                .println("Pausing normal execution and waiting for long task to finish...");
        synchronized (lock) {
            try {
                lock.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("Resuming normal execution as long task is done.");
    }
    public static void main(String[] a) {
        new WaitNotifyExample().runLongTask();
    }
}

Note: This is far from fool proof. One case where it will fail is if the long task is over before that lock.wait() is called.