为什么我们创建新线程并使用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()使父线程等待?为什么不能使用父线程而不是新线程?

+0

调用*** TX的使用CountDownLatch。运行()***没有启动任何线程,这是不同的! –

+0

在第二种情况下,您的主要方法可能会在线程t1和t2之前完成。这是不同之处。在第一种情况下,Main方法永远不会在线程t1和t2之前完成。 –

+0

我知道,我的问题是为什么创建线程,当我们需要停止当前线程,直到它完成?为什么简单地不使用当前线程而不是新线程? – MTB

在这两方面,你都没有得到好处。

在你的第一个例子中,你有两个线程,join()没有用。

但是假设一个场景,其中

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

在上述情况下完成,所有线程可以启动并行但你只加入T3T4线程。

请参阅以下职位的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()

+0

我已经得到了我的答案:第一种方式并没有利用多线程。 我知道运行和启动的区别,在第二个代码中,我想要调用运行方法,就像其他方法调用在t1和t2 run()中执行代码一样。 – MTB