如何使用通知和等待

可以等待/通知在一个线程内使用? 我的意思是我有一个听众,当那个听众被调用的时候,我想让一个线程去做他的工作。我该怎么做?

更新:我的数据写入一个数据库…每写入一次监听器就写入数据。现在,我创build的线程读取数据并将其发送到某个地方….接下来…我得到一些其他的数据并做同样的事情….另一个线程需要知道什么是他读的最后一个数据,所以他可以从他离开的地方开始阅读….

看看这里: 使用等待,并在一个线程内通知这是我的问题如何看起来像.Thx

我有以下几点:

synchronized (syncToken) { try { syncToken.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("MyThread: " + s); 

MyThread ….所以当我这样做

 MyThread t = new MyThread(syncToken); t.start(); 

我把我的线等待…是的?

当我这样做:

 syncToken.notify(); 

我得到我的线程回到正轨….但下一行的执行是wait()之后的一个?

我的意思是这样的: System.out.println("MyThread: " + s); ????

当你通知一个他是否继续他的执行后,等待()??? Thx

Solutions Collecting From Web of "如何使用通知和等待"

以下是两个不同线程之间并发的简单示例。 在这个例子中,主线程启动一个MyThread线程,每3秒钟将一个数据设置到MyThread实例,然后MyThread将它打印出来。 这个想法是有一个同步的对象,你wait它,并在使用结束时notify其他线程,他们可以使用它:

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; } } 

在这个例子中,主线程设置一个string(每3秒),MyThread线程打印它。

适应你的需求,不应该太难。

我有类似的问题。 我创build了一个由两个线程使用的仲裁器(在你的情况下,它可以是侦听器线程和你的任务线程):listener:

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

任务线程:

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

仲裁者:

 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(); }} 

监听器和任务将同步自己对仲裁员监控。 也许你可以打电话给你的仲裁队列或pipe道,并存储date消费?