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?