我有两个线程T1和T2。 T2应该从T1收到消息后开始工作。 T1和T2都在main()中启动。 T1无法启动T2。
这是我到目前为止所做的:
T1:
//do work1 which should be executed before work2
lock2.notify()
T2:
lock2.wait();
//do work2 which should be executed after work1 ends
问题是有时T1在T2之前启动而T2从未获得T1发送的通知并且永远等待。
我可以使用任何现有的并发实用程序来实现此信令吗?
感谢。
答案 0 :(得分:2)
两个线程之间需要一些同步机制。下面是我为此目的使用CountDownLatch
的示例。我定义了一个类SyncedThread
,它在构造函数中传递了CountDownLatch
。
在main方法中,然后我创建了这个类的两个实例。第一个,thread1
将运行2秒,然后发出CountDownLatch信号,然后再进行一次虚拟睡眠,持续3秒。
第二个实例thread2
将等待CountDownLatch,然后将在5秒内模拟工作。
thread2.start()
方法,然后调用thread1.start()
延迟500毫秒,但是通过使用同步,您将在输出中看到实际thread2
等待{{1} }}
thread1
答案 1 :(得分:1)
通常,每当您使用wait()
和notify()
时,您还应该使用某种机制(例如标记变量)来检查您是否已完成等待。来自the Javadoc for wait()
:
[...]此方法应始终用于循环:
synchronized (obj) { while (<condition does not hold>) obj.wait(); ... // Perform action appropriate to condition }
在您的情况下,如果您实际上不需要等待,则意味着您根本不会进入循环。
那就是说,您可能想重新考虑从main()
启动两个线程;从你的描述来看,为什么你这样做是不明显的。
答案 2 :(得分:0)
当t2没有发送消息时,你应该让T1等待
添加共享变量以表示消息,并在while
语句中使用它
在lock2.send(); invoke
lock2.notify();`之后,为了在等待时通知T1。
T1:
while (lock2.isNotSend()){
lock2.wait();
}
lock2.notify()
//do some work
T2:
// processing that sends the message
lock2.send();
lock2.notify();
lock2.wait();