簡體   English   中英

為什么在這段代碼中 Java 的 Thread.join() 不等待所有線程死亡?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM