[英]Why doesn't Java's Thread.join() wait for all threads to die in this code?
我遍歷我的線程數組並開始每個線程。 然后在第二個循環中,我為每個線程調用 thread.join(),期望它等待所有線程死亡,然后主線程恢復執行,但這不是發生的事情。 線程似乎沒有加入,但在加入后繼續執行。
我已經嘗試為每個線程單獨調用 join 方法,但這不起作用。 我通過使用 Count Down Latch 找到了一種解決方法,它給了我想要和期望的結果,但我希望使用內置的線程方法。
for (UserThread thread : threadArray)
{
UserThread newThread = new UserThread();
thread = newThread;
thread.start();
}
for (UserThread thread : threadArray)
{
thread.join();
}
這是我在使用 thread.join() 時看到的。
Before
data.array[0] = 0
data.array[1] = 1
Creating Thread_0 with threadInt 0
Starting Thread_0
Creating Thread_1 with threadInt 1
Starting Thread_1
Running Thread_0
Thread: Thread_0 adding 5 to threadInt
After
data.array[0] = 5
Thread Thread_0 exiting.
Running Thread_1
data.array[1] = 1
Thread: Thread_1 adding 5 to threadInt
Thread Thread_1 exiting.
這是我期望使用 thread.join 和使用倒計時鎖存器時看到的內容。
Before
data.array[0] = 0
data.array[1] = 1
Creating Thread_0 with threadInt 0
Starting Thread_0
Creating Thread_1 with threadInt 1
Starting Thread_1
Running Thread_0
Thread: Thread_0 adding 5 to threadInt
Running Thread_1
Thread: Thread_1 adding 5 to threadInt
Thread Thread_0 exiting.
After
Thread Thread_1 exiting.
data.array[0] = 5
data.array[1] = 6
就可以看到這里的問題與線程變量引用分配有關。 您正在嘗試分配給變量thread
,它是迭代變量。 此賦值不會更改數組,因為thread
變量是對當前數組元素的引用的副本。 如果你想正確初始化,你應該在帶有計數器的公共循環中進行:
for (int i = 0; i < threadArray.length; ++i) {
UserThread newThread = new UserThread();
threadArray[i] = newThread;
threadArray[i].start();
}
之后您似乎可以加入您的主題。
錯誤正如所羅門慢指出的那樣,我正在創建一個新線程然后忘記了它。 該錯誤是在嘗試解決一個無關的問題時引入的。下面的代碼給了我與倒計時鎖存器相同的結果(預期)。
for (UserThread thread : threadArray)
{
thread = new UserThread();
thread.start();
}
for (UserThread thread : threadArray)
{
if (thread != null)
thread.join();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.