java - 为什么我们创建新线程并使用 join() 让父线程等待?

标签 java multithreading 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();
}

在此示例中使用线程与以下代码相比有何优势:

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() 没有用。

但是假设一个场景

  1. 您有多个线程(主线程、T1、T2、T3 和 T4)
  2. Main、T1、T2 可以并行运行,但 T3 应等待 T4 完成

在上述情况下,所有线程都可以并行启动,但您只能加入 T3T4 线程。

请参阅下面的帖子了解 join() 的用例:

Why we should use Join in threads?

如果您想探索多线程的高级版本,请使用 CountDownLatch代替join()

关于java - 为什么我们创建新线程并使用 join() 让父线程等待?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44384171/

相关文章:

mysql - 连接多个sql表以查找共同值

Codeigniter 3 - 查询生成器 'join' 方法问题 - 记录重复

java - Android:多列 ArrayList 到 Listview

java - 如何构造 SQL 语句以避免过多的连接

javascript - Node.js 的缺点?

java - 如何在java中最好地实现 "fetch-and-set"?

mysql - 如何使用mysql连接两个属性相同但每个表中数据不同的表

java - volatile 会传播到实例成员吗?

java - 在java中只返回奇数(int)的方法

java - 在多线程中调用重绘?