how to use notify and wait how to use notify and wait database database

how to use notify and wait


The following is a simple example of concurrency between two different threads. In the example the main thread start a MyThread thread and every 3 seconds it sets a data to the MyThread instance and then MyThread prints it. The idea is to have a synchronized object that you wait on it and notify in the end of the usage to other threads that they can use it:

Test.java:

package stack;public class Test {    public static void main (String args[])    {        Object syncToken = new Object();        MyThread t = new MyThread(syncToken);        t.start();        for (int i = 0; i < 10; i++)        {            try {                Thread.sleep(3000);            } catch (InterruptedException e) {                e.printStackTrace();            }            synchronized(syncToken)            {                t.setText("Iteration " + i);                syncToken.notify();            }        }    }}

MyThread.java:

package stack;public class MyThread extends Thread{    String s;    Object syncToken;    public MyThread(Object syncToken)    {        this.s = "";        this.syncToken = syncToken;    }    public void run()    {        while(true) // you will need to set some condition if you want to stop the thread in a certain time...        {            synchronized (syncToken)            {                try {                    syncToken.wait();                } catch (InterruptedException e) {                    e.printStackTrace();                }            }            System.out.println("MyThread: " + s);        }    }    public void setText(String s)    {        this.s = s;    }}

In this example, the main thread sets a string (every 3 seconds) and the MyThread thread prints it.

Adapt it to your needs, it shouldn't be too hard.


I had similar problem. I created an arbiter used by two threads (in your case it can be listeners thread and your task thread):listener:

arbiter.waitConsumer();// prepare dataarbiter.dataLoaded();

task thread:

while(true){  arbiter.waitProducer();  // consume data  arbiter.dataConsumed();}

arbiter:

public class Arbiter {private boolean dataLoaded = false;public synchronized void waitProducer(){    while(!dataLoaded){        try {            wait();        } catch (InterruptedException e) {            e.printStackTrace();        }    }}public synchronized void waitConsumer(){    while(dataLoaded){        try {            wait();        } catch (InterruptedException e) {            e.printStackTrace();        }    }}public synchronized void dataLoaded(){    dataLoaded = true;    notify();}public synchronized void dataConsumed(){    dataLoaded = false;    notify();}}

Listener and task will synchronize themselfes against arbiters monitor. Probably you can call your arbiter queue or pipe and store date for consuming in it?