【问题标题】:Why we create new thread and use join() to make parent thread waiting?为什么我们创建新线程并使用 join() 让父线程等待?
【发布时间】:2017-06-06 07:45:43
【问题描述】:

在阅读了 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() 让父线程等待?为什么不能用父线程代替新线程?

【问题讨论】:

  • 调用 tx.run() 并没有启动任何线程,这就是区别!
  • 在第二种情况下,您的 main 方法可能在您的线程 t1 和 t2 之前完成。这就是区别。在第一种情况下,Main 方法永远不会在线程 t1 和 t2 之前完成。
  • 我知道,我的问题是当我们需要停止当前线程直到它完成时,为什么要创建线程?为什么干脆不使用当前线程而不是新线程?

标签: java multithreading join


【解决方案1】:

在这两种方式中,您都没有得到好处。

在您的第一个示例中,您有两个线程,join() 没有用处。

但是假设一个场景

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

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

join()的用例参考下面的帖子:

Why we should use Join in threads?

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

【讨论】:

    【解决方案2】:

    第一种方式不利用多线程。

    我们可以用单线程编写它,它在多线程方面没有任何改变:

    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() 后,才会调用t2.run()

    【讨论】:

    • 我的答案是:第一种方法不会从多线程中获利。我知道 run 和 start 的区别,在第二个代码中我想调用 run 方法,就像任何其他方法调用一样在 t1 和 t2 run() 中执行代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    • 2011-05-10
    相关资源
    最近更新 更多