等到所有线程都在等待之前,先通知

时间:2018-11-12 14:00:42

标签: java multithreading wait

MyClass中,我像这样在循环中创建多个线程:

for(int i = 0; i < 4; i++)
{
    threads[i] = new Thread(new MyRunnable(lock));
    threads[i].start();
}

其中lockMyClass的属性,并且每个线程在其run方法中都调用lock.wait()

创建完这些线程后,我想分配其中一个锁控制权。我只是尝试将lock.notify()放在循环之后,但这运行得太早了-尽管它在循环之后,但没有一个线程执行过lock.wait(),因此它们都错过了lock.notify(),并且然后无限期地等待另一个永远不会来的东西。

我可以暂停主线程的执行,例如在调用Thread.sleep(1000)之前执行lock.notify()。这之所以有效,是因为它使线程有机会在wait之前进入notify阶段。但这似乎不太优雅,显然我不希望这样停止程序的主要执行。

我应该如何实现?

2 个答案:

答案 0 :(得分:1)

您可以使用并发包中的一些更高级的构造,例如Semaphore

因此,您需要在循环之前使用单个“许可”设置信号量,然后将其传递给线程,然后所有这些人都将尝试“获取”该许可(只有其中一个可以做到,其他人将因此失败。

即使信号量也很低级,通常您可以找到更适合您的实际应用程序的内容,例如阻塞队列或并发集合。

答案 1 :(得分:-1)

看看Thread.join()方法,该方法可以帮助您等待当前线程,直到调用该方法的线程未完成为止。

示例:

Thread t1 = new Thread();
Thread t2 = new Thread();
t1.start();
t1.join();
t2.start();

这里t2将等待t1完成。有关它的更多信息,您可以阅读here