代码之家  ›  专栏  ›  技术社区  ›  Mike

在Java中传递执行到不同的/特定的线程

  •  1
  • Mike  · 技术社区  · 15 年前

    我有四根线。一个线程不断检查另一个线程正在更新的一些数据。其他人在后台做一些处理。所有这些都是从现在开始的。

    我的问题是,当检查线程看到数据还没有更新,但我目前睡眠了一点,但有什么方法可以让系统返回执行执行线程进行更新?

    或者,我是否可以将类似监听器的东西放到数据(字符串)上,一旦它被更新,一个事件将触发,它将做它需要做的事情?

    我尝试使用yield(),但它似乎一直返回到我从中调用yield()的线程。

    谢谢

    3 回复  |  直到 15 年前
        1
  •  2
  •   mdma    15 年前

    这种简单的通知就是 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() 要从队列中提取更新事件,请等待队列中没有更新。

    与此方案的不同之处在于,更新程序线程可以传递有关已更改内容的特定信息,而不是像wait/notify那样只说“已更改的内容”。

    此外,线程会明确地通知每个更新,因此不会丢失任何更新。它也比等待/通知更灵活,因为更新通知不需要锁定数据。

        2
  •  1
  •   dty    15 年前

    不能强制给定线程运行。但是,您可以将检查线程置于睡眠状态,并让生成线程在数据准备就绪时通知它。

    这是一个典型的“生产者/消费者”问题,java.lang.object有一些方法可以帮助您实现这个问题(wait/notify/notifyall)。对于更高级别的构造,请检查java.util.concurrent

        3
  •  0
  •   VeeArr    15 年前

    你应该考虑 wait() notify() .