2011-05-06 71 views
9

可以等待/通知在一個線程內使用嗎? 我的意思是我有一個監聽者,當那個監聽者被調用的時候,我想啓用一個線程來完成他的工作。我該怎麼做?如何使用通知和等待

更新:我的數據寫入數據庫中......每次調用監聽器時寫入數據。現在,我創建的線程將讀取該數據並將其發送到某處...... 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://stackoverflow.com/questions/5915449/using-wait-and-notify-within-one-thread) – 2011-05-06 19:56:02

回答

13

以下是兩個不同的線程之間的併發的一個簡單的例子執行。在這個例子中,主線程啓動一個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

2

我有類似的問題。我創建了兩個線程使用的仲裁器(在你的情況下,可以監聽線程,你的任務線程): 聽衆:

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

監聽器和任務將自己同步仲裁器監視器。大概你可以打電話給你的仲裁隊列或管道並存儲日期以供消費嗎?