2010-06-08 24 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