如何使用通知和等待

问题描述:

可以等待/通知在一个线程内使用吗? 我的意思是我有一个监听者,当那个监听者被调用的时候,我想启用一个线程来完成他的工作。我该怎么做?如何使用通知和等待

更新:我的数据写入数据库中......每次调用监听器时写入数据。现在,我创建的线程将读取该数据并将其发送到某处...... Next ...我看到一些数据,做同样的事情....其他线程需要知道什么是他读了,这样他就可以开始从他离开的地方读取最后一个数据....

采取这里看看: using wait and notify within one thread 这是我的问题怎么看like.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(); 

我得到我的线程回到正轨....但下一行的执行是等待一前一后()?

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

当U通知thred做他继续他的等待后线()??? THX

+0

[在一个线程中使用wait和notify]可能的重复(http://*.com/questions/5915449/using-wait-and-notify-within-one-thread) – 2011-05-06 19:56:02

以下是两个不同的线程之间的并发的一个简单的例子执行。在这个例子中,主线程启动一个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; 
    } 
} 

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

使其适应您的需求,它不应该是太辛苦了。

+0

Acutally I do ...因为当这个监听器被调用时,我接收到一些需要由线程处理的数据,并且数据在许多周期中被接收到....我的意思是现在我得到一些数据并且监听器被调用...我也应该调用其他线程来管理数据...一段时间后,我得到其他数据,并必须做同样的事情....你明白吗? – adrian 2011-05-06 20:02:18

+0

但它是否必须在同一个线程上发生?数据的每个部分取决于其他? – MByD 2011-05-06 20:03:25

+0

我编辑了我的问题...请在那里看看 – adrian 2011-05-06 20:09:06

我有类似的问题。我创建了两个线程使用的仲裁器(在你的情况下,可以监听线程,你的任务线程): 听众:

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

监听器和任务将自己同步仲裁器监视器。大概你可以打电话给你的仲裁队列或管道并存储日期以供消费吗?