2010-06-08 70 views
1

我有大約4個線程。一個線程不斷檢查其他線程正在更新的一些數據。其他人正在後臺進行一些處理。這一切都已經開始。將執行傳遞給Java中的不同/特定線程

我的問題是當檢查線程發現數據還沒有更新時,我現在睡了一會兒,但有什麼辦法讓我告訴系統返回執行更新的線程嗎?

這或有什麼辦法,我可以把喜歡的東西上的數據監聽器(一個字符串),一旦其更新的事件就會觸發,會做什麼,需要做什麼?

我試着用收益率(),它似乎只是回頭率線程我叫收益率()的。

感謝

回答

2

這種簡單的通知是Object.wait()Object.notify()的目的。

在你更新線程,你有

void updateData() { 
    synchronized (theData) { 
     theData.doSomeUpdate(); 
     theData.notifyAll(); // tell other threads of a change 
    } 
} 

,然後在檢查線程,有

void waitForUpdates() { 
    synchronized (theData) { 
     while (notCancelled) { 
      theData.wait(); // wait for notification 
      handleUpdate(theData); 
     } 
    }   
} 

不要使用Thread.sleep()方法,因爲你不能真正醒來線程,除非你打斷它,這有點討厭。相反,使用上面的等待/通知過程。

你也可以看看經由在線程之間共享一個明確的BlockingQueue傳遞通知。更新程序線程將事件放入隊列中,檢查程序線程使用take()從隊列中提取更新事件,等待隊列中沒有更新。

在這個方案中不同的是,更新線程可以通過什麼發生了變化的具體信息,而不是僅僅說:「事情發生了轉變」,如同等待/通知的情況下。

此外,線程通知每次更新的明確,所以沒有更新被錯過。它比等待/通知更靈活,因爲通知更新不需要鎖定數據。

+0

這很有道理謝謝 – Mike 2010-06-08 21:13:53

1

您無法強制給定線程運行。但是,您可以將您的檢查線程休眠並讓您的生產線程在數據準備就緒時通知它。

這是一個典型的「生產者/消費者」的問題,並具有java.lang.Object繼承的方法來幫助你實現這個(等待/通知/ notifyAll的)。對於更高級別的構造,查看java.util.concurrent