2017-06-06 101 views
1

在閱讀了關於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

回答

1

在這兩方面,你都沒有得到好處。

在你的第一個例子中,你有兩個線程,join()沒有用。

但是假設一個場景,其中

  1. 您有多個線程(主線程,T1,T2,T3和T4
  2. 主,T1,T2可以並行但T3運行應等待T4

在上述情況下完成,所有線程可以啓動並行但你只加入T3T4線程。

請參閱以下職位的join()用例:

Why we should use Join in threads?

如果你想探索多線程的高級版本,到位join()

1

第一種方式並沒有利用多線程。

我們可以用一個線程寫,它改變不了什麼的線程多的方面:

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

相關問題