如何确保在另一个线程之前启动线程?

时间:2017-05-23 06:39:16

标签: java multithreading concurrency

我有两个线程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发送的通知并且永远等待。

我可以使用任何现有的并发实用程序来实现此信令吗?

感谢。

3 个答案:

答案 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();