0

在互联网上遇到一些问题时,我发现了这个。不知道如何解决这个问题。

我希望线程 1 首先运行并计算 foo 并等待,然后希望线程 2 运行并计算 foo,最后希望线程 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();
    }
}
4

2 回答 2

3

没有看太多你的代码,我认为它是这样工作的:

线程 1 计算 foo,创建并启动线程 2。线程 1 调用thread2.join(). 这使线程 1 被挂起,直到线程 2 完成。然后继续 Thread 1 的最终代码。

无需通知,只需一个简单的join().

于 2013-03-25T00:22:13.207 回答
2

像这样的通知/等待代码的一种替代方法是使用BlockingQueuelike LinkedBlockingQueue。使用 2BlockingQueue秒,两个线程可以相互等待并来回传递消息,而无需编写所有可能复杂且充满错误的等待和通知代码。

于 2013-03-25T11:40:41.180 回答