在网上遇到一些问题时,我发现了这个问题。不知道如何解决这个问题。
我希望线程1先运行并计算foo并等待,然后希望线程2运行并计算foo,最后希望thread-1继续并打印foo并完成执行。
自从过去1小时以来我一直在思考这个问题而无法解决。任何帮助表示赞赏。感谢。
public class ThreadTest {
private static class Thread01 extends Thread {
private Thread02 _thread02;
public int foo = 0;
public void setThread02(Thread02 thread02) {
_thread02 = thread02;
}
public void run() {
try {
for (int i = 0; i < 10; i++) foo += i;
synchronized (this) { this.notify(); }
synchronized (_thread02) { _thread02.wait(); }
System.out.println("Foo: " + _thread02.foo);
} catch (InterruptedException ie) { ie.printStackTrace(); }
}
}
private static class Thread02 extends Thread {
private final Thread01 _thread01; public int foo = 0;
public Thread02(Thread01 thread01) {
_thread01 = thread01;
}
public void run() {
try {
synchronized (_thread01) { _thread01.wait(); }
foo = _thread01.foo;
for (int i = 0; i < 10; i++) foo += i;
synchronized (this) { this.notify(); }
} catch (InterruptedException ie) { ie.printStackTrace(); }
}
}
public static void main(String[] args) throws Exception {
Thread01 thread01 = new Thread01();
Thread02 thread02 = new Thread02(thread01);
thread01.setThread02(thread02);
thread01.start();
thread02.start();
thread01.join();
thread02.join();
}
}
答案 0 :(得分:3)
如果没有仔细查看您的代码,我认为它的工作原理如下:
线程1计算foo,创建并启动线程2.线程1调用thread2.join()
。这将线程1暂停,直到线程2完成。然后继续使用Thread 1的最终代码。
无需通知,只需一个简单的join()
。
答案 1 :(得分:2)
像这样通知/等待代码的一种替代方法是使用BlockingQueue
之类的BlockingQueue
。使用2 {{1}} s,两个线程可以相互等待并来回传递消息,而无需编写所有等待和通知代码,这些代码可能很复杂且充满了bug。