在MyClass
中,我像这样在循环中创建多个线程:
for(int i = 0; i < 4; i++)
{
threads[i] = new Thread(new MyRunnable(lock));
threads[i].start();
}
其中lock
是MyClass
的属性,并且每个线程在其run
方法中都调用lock.wait()
。
创建完这些线程后,我想分配其中一个锁控制权。我只是尝试将lock.notify()
放在循环之后,但这运行得太早了-尽管它在循环之后,但没有一个线程执行过lock.wait()
,因此它们都错过了lock.notify()
,并且然后无限期地等待另一个永远不会来的东西。
我可以暂停主线程的执行,例如在调用Thread.sleep(1000)
之前执行lock.notify()
。这之所以有效,是因为它使线程有机会在wait
之前进入notify
阶段。但这似乎不太优雅,显然我不希望这样停止程序的主要执行。
我应该如何实现?
答案 0 :(得分:1)
您可以使用并发包中的一些更高级的构造,例如Semaphore。
因此,您需要在循环之前使用单个“许可”设置信号量,然后将其传递给线程,然后所有这些人都将尝试“获取”该许可(只有其中一个可以做到,其他人将因此失败。
即使信号量也很低级,通常您可以找到更适合您的实际应用程序的内容,例如阻塞队列或并发集合。
答案 1 :(得分:-1)
看看Thread.join()
方法,该方法可以帮助您等待当前线程,直到调用该方法的线程未完成为止。
示例:
Thread t1 = new Thread();
Thread t2 = new Thread();
t1.start();
t1.join();
t2.start();
这里t2
将等待t1
完成。有关它的更多信息,您可以阅读here。