如何使Java线程等待另一个线程的输出?

我正在使用一个应用程序逻辑线程和数据库访问线程的Java应用程序。
它们都在应用程序的整个生命周期内保持,并且都需要同时运行(一个与服务器通信,一个与用户通信;当应用程序完全启动时,我需要两个都工作)。

但是,在启动时,我需要确保最初应用程序线程等待,直到数据库线程准备好(目前通过轮询自定义方法dbthread.isReady()确定。
我不介意应用程序线程阻塞,直到db线程准备好了。

Thread.join()看起来不像一个解决方案 – db线程只在app关闭时退出。

while(!dbthread.isReady()){}这样的工作,但空循环消耗了很多处理器周期。

任何其他想法?谢谢。

最佳答案
我真的建议你经历一个教程,如Sun’s Java Concurrency,你开始在多线程的魔法世界。

还有一些好书出来了(google for“Concurrent Programming in Java”,“Java Concurrency in Practice”)。

要得到你的答案:

在你必须等待dbThread的代码中,你必须有这样的:

//do some work
synchronized(objectYouNeedToLockOn){
    while (!dbThread.isReady()){
        objectYouNeedToLockOn.wait();
    }
}
//continue with work after dbThread is ready

在你的dbThread的方法中,你需要做这样的事情:

//do db work
synchronized(objectYouNeedToLockOn){
    //set ready flag to true (so isReady returns true)
    ready = true;
    objectYouNeedToLockOn.notifyAll();
}
//end thread run method here

objectYouNeedToLockOn我在这些例子中使用的最好是需要从每个线程并发操作的对象,或者您可以为此目的创建一个单独的对象(我不建议使方法本身同步):

private final Object lock = new Object();
//now use lock in your synchronized blocks

为了进一步了解:
有其他(有时更好的)方法来做上述,例如。与CountdownLatches等。从Java 5开始,在java.util.concurrent包和子包中有很多漂亮的并发类。你真的需要在线找到材料来了解并发,或者得到一本好书。

转载注明原文:如何使Java线程等待另一个线程的输出? - 代码日志