亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如果 join 阻塞了主線程,為什么它不阻塞在循環中?

如果 join 阻塞了主線程,為什么它不阻塞在循環中?

人到中年有點甜 2023-02-23 16:30:48
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 調用只是延遲線程的運行,直到每個工作線程都結束。



查看完整回答
反對 回復 2023-02-23
  • 1 回答
  • 0 關注
  • 153 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號