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

2022-08-31 08:13:12

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

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

Thread.join()看起来不像一个解决方案 - 数据库线程仅在应用程序关闭时退出。

while (!dbthread.isReady()) {}有点工作,但空循环消耗了大量的处理器周期。

还有其他想法吗?谢谢。


答案 1

使用计数器为 1 的 CountDownLatch

CountDownLatch latch = new CountDownLatch(1);

现在在应用程序线程中做 -

latch.await();

在 db 线程中,完成后,执行 -

latch.countDown();

答案 2

我真的建议你在开始进入多线程的神奇世界之前,先学习一下像Sun的Java并发这样的教程。

也有许多好书出来(谷歌的“Java中的并发编程”,“Java并发实践”。

要获得答案:

在必须等待 的代码中,必须有如下内容: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

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

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

为了进一步加深您的理解:
还有其他(有时更好)方法可以完成上述操作,例如 with 等。从Java 5开始,包和子包中有很多漂亮的并发类。你真的需要在网上找到材料来了解并发性,或者得到一本好书。CountdownLatchesjava.util.concurrent