Thread 實例的 join() 方法可用于將一個線程的執行開始“連接”到另一個線程的執行結束,以便一個線程在另一個線程結束之前不會開始運行。如果在 Thread 實例上調用 join(),則當前正在運行的線程將阻塞,直到 Thread 實例完成執行但是如果 ia 有多個線程并且當我在循環內調用 join 時。所有線程并行運行。但是根據連接概念,首先連接的線程應該完成,然后只有主線程應該允許連接其他線程。public class MultiThreading implements Runnable {private int name;public MultiThreading(int number) { name =number;}@Overridepublic void run() { for (int i = 0; i <= 10; i++ ) { System.out.println("Thread number :" + name +" Printed value "+i); try { Thread.sleep(100); } catch (final InterruptedException e) { return; } }}public static void main(String[] args) throws InterruptedException { final Thread[] workers = new Thread[3]; for (int i = 0; i < nthreads; ++i) { workers[i] = new Thread(new MultiThreading(i)); } for (final Thread t : workers) { t.start(); } for (final Thread t : workers) { t.join(); System.out.println("Thread joind to main thread : " + t.getName()); } System.out.println("Main thread ends");}}在上面的代碼中,如果第一個線程被加入,那么主線程應該被阻塞并且不應該讓其他線程加入(直到被加入的線程完成run方法的執行)。但是所有線程都是并行連接的。輸出就像 -Thread number :0 Printed value 0Thread number :1 Printed value 0Thread number :2 Printed value 0Thread number :0 Printed value 1Thread number :1 Printed value 1Thread number :2 Printed value 1Thread number :0 Printed value 2Thread number :1 Printed value 2Thread number :2 Printed value 2Thread number :0 Printed value 3Thread number :1 Printed value 3Thread number :2 Printed value 3Thread number :0 Printed value 4Thread number :1 Printed value 4Thread number :2 Printed value 4Thread number :1 Printed value 5
1 回答

犯罪嫌疑人X
TA貢獻2080條經驗 獲得超4個贊
首先:
Thread 實例的 join() 方法可用于將一個線程執行的開始“連接”到另一個線程執行的結束
這是一個誤解:這與啟動線程無關。Join 僅執行此操作:正在運行的線程將等待另一個線程結束。
當您這樣做時someThread.join()
,調用該方法的線程將等到 someThread 結束!
但是所有線程都是并行連接的。
是的,因為它們都完成了。
您的線程執行所有完全相同的事情,所以除了這里或那里的幾納秒之外(由于寫入 System.out 無論如何都有效地同步內容,這大部分是無效的)它們都需要相同的時間。
所以當你加入第一個線程時......其他兩個線程將完成。因此,第一次調用join()
使“主”線程等待第一個線程結束,隨后的調用“立即”發生,因為這些線程也已完成。
為了延遲事情,將循環次數作為您的MultiThreading
類的參數,然后確保您的線程需要不同的時間量。如果 Thread-0 執行 10 次循環,Thread-1 執行 20 次,而 Thread-2 執行 30 次,您將看到每個連接實際上都在等待相應的線程結束。
長話短說:您立即啟動所有線程,因此它們立即開始并行運行。后面的 join 調用只是延遲主線程的運行,直到每個工作線程都結束。
添加回答
舉報
0/150
提交
取消