Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使两个线程互相等待以执行任务?_Java_Multithreading - Fatal编程技术网

Java 如何使两个线程互相等待以执行任务?

Java 如何使两个线程互相等待以执行任务?,java,multithreading,Java,Multithreading,在网上浏览一些问题时,我发现了这个问题。不知道如何解决这个问题 我希望线程1首先运行并计算foo并等待,然后希望线程2运行并计算foo,最后希望线程1继续并打印foo并完成执行 我从上一个小时就开始思考这个问题,但无法解决。感谢您的帮助。谢谢 public class ThreadTest { private static class Thread01 extends Thread { private Thread02 _thread02; publ

在网上浏览一些问题时,我发现了这个问题。不知道如何解决这个问题

我希望线程1首先运行并计算foo并等待,然后希望线程2运行并计算foo,最后希望线程1继续并打印foo并完成执行

我从上一个小时就开始思考这个问题,但无法解决。感谢您的帮助。谢谢

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();
    }
}
公共类线程测试{
私有静态类Thread01扩展线程{
private Thread02_Thread02;
公共int foo=0;
公共无效setThread02(Thread02 Thread02){
_thread02=thread02;
}
公开募捐{
试一试{
对于(inti=0;i<10;i++)foo++=i;
已同步(this){this.notify();}
已同步(_thread02){u thread02.wait();}
System.out.println(“Foo:”+_thread02.Foo);
}catch(InterruptedException ie){ie.printStackTrace();}
}
}
私有静态类Thread02扩展线程{
私有最终线程01 _Thread01;公共int foo=0;
公共线程02(线程01线程01){
_thread01=thread01;
}
公开募捐{
试一试{
已同步(_thread01){u thread01.wait();}
foo=_thread01.foo;
对于(inti=0;i<10;i++)foo++=i;
已同步(this){this.notify();}
}catch(InterruptedException ie){ie.printStackTrace();}
}
}
公共静态void main(字符串[]args)引发异常{
Thread01 Thread01=新的Thread01();
Thread02 Thread02=新的Thread02(thread01);
thread01.setThread02(thread02);
thread01.start();
thread02.start();
thread01.join();
thread02.join();
}
}

在没有仔细查看您的代码的情况下,我认为它是这样工作的:

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


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

就可以了,而无需查看您的代码。我认为它的工作原理如下:

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


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

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

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

您至少可以查看问题=)@Pescis没有。我的答案正是他想要实现的。我认为这是一次失败的SSSCE尝试,当thread2完成计算foo时,他实际上想做一些事情(否则整个线程完全没有用,可以用一个线程完成)。@Pescis你完全正确。他描述它的方式可以通过一个简单的连接来实现,因为他似乎不需要任何并发执行。谢谢你的回答。然而,我希望找到一些技巧与等待/通知,以实现相同的。。。是的,多线程是必需的。它必须并行运行…至少在它们可以运行之前…你至少可以看看问题=)@Pescis没有。我的答案正是他想要实现的。我认为这是一次失败的SSSCE尝试,当thread2完成计算foo时,他实际上想做一些事情(否则整个线程完全没有用,可以用一个线程完成)。@Pescis你完全正确。他描述它的方式可以通过一个简单的连接来实现,因为他似乎不需要任何并发执行。谢谢你的回答。然而,我希望找到一些技巧与等待/通知,以实现相同的。。。是的,多线程是必需的。它必须并行运行…至少直到它们可以运行为止…我不知道为什么,但是在字段名之前使用下划线让我想杀死一些东西!我不知道为什么,但在字段名之前使用下划线会让我想杀死一些东西!