为什么我们创建新线程并使用join()使父线程等待?
在阅读了关于join方法之后,我有一些疑问:我认为多线程是一种在我们的程序中引入并行性的方法,并且相信有时候我们需要某个线程在另一个之前完成。但我不明白为什么一个程序员写是这样的:为什么我们创建新线程并使用join()使父线程等待?
public static void main(String[] args) {
Thread t1 = new Thread(new MyRunnable(), "t1");
Thread t2 = new Thread(new MyRunnable(), "t2");
t1.start();
t1.join();
t2.start();
t2.join();
}
什么在这个例子中使用线程VS下面的代码的好处是:在第一个例子
public static void main(String[] args) {
Thread t1 = new Thread(new MyRunnable(), "t1");
Thread t2 = new Thread(new MyRunnable(), "t2");
t1.run();//just run the task of thread without start new thread
t2.run();
}
主线程应该暂停,直到T1完成,然后开始t2并等待完成,并在第二个例子中它也发生了。
为什么我们创建新线程并使用join()使父线程等待?为什么不能使用父线程而不是新线程?
在这两方面,你都没有得到好处。
在你的第一个例子中,你有两个线程,join()
没有用。
但是假设一个场景,其中
- 您有多个线程(主线程,T1,T2,T3和T4)
- 主,T1,T2可以并行但T3运行应等待T4
在上述情况下完成,所有线程可以启动并行但你只加入T3和T4线程。
请参阅以下职位的join()用例:
Why we should use Join in threads?
如果你想探索多线程的高级版本,到位join()
第一种方式并没有利用多线程。
我们可以用一个线程写,它改变不了什么的线程多的方面:
Thread t1 = new Thread(new MyRunnable(), "t1");
t1.start();
t1.join();
t1 = new Thread(new MyRunnable(), "t2");
t1.start();
t1.join();
使用的t1.run();
代替t1.start();
不会启动线程等等这些第二种方式:
t1.run();
t2.run();
是对Thread
对象的简单同步(阻塞)调用。
只有在返回t1.run()
之后,才调用t 2.run()
。
我已经得到了我的答案:第一种方式并没有利用多线程。 我知道运行和启动的区别,在第二个代码中,我想要调用运行方法,就像其他方法调用在t1和t2 run()中执行代码一样。 – MTB
调用*** TX的使用CountDownLatch。运行()***没有启动任何线程,这是不同的! –
在第二种情况下,您的主要方法可能会在线程t1和t2之前完成。这是不同之处。在第一种情况下,Main方法永远不会在线程t1和t2之前完成。 –
我知道,我的问题是为什么创建线程,当我们需要停止当前线程,直到它完成?为什么简单地不使用当前线程而不是新线程? – MTB