为什么Java的Thread.join()不等待所有线程在此代码中死亡?

我循环遍历我的线程数组并启动每个线程。然后在第二个循环中,我为每个线程调用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 看到的,以及当我使用 Count Down Latch 时所看到的。


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


ABOUTYOU
浏览 96回答 2
2回答

三国纷争

正如Solomon Slow指出的那样,错误是我正在创建一个新线程,然后忘记了它。该错误是在尝试解决不相关的问题时引入的。下面的代码为我提供了与倒计时闩锁相同的结果(预期)。    for (UserThread thread : threadArray)    {        thread = new UserThread();        thread.start();    }    for (UserThread thread : threadArray)    {        if (thread != null)            thread.join();    }

HUX布斯

据了解,此处的问题与线程变量引用分配有关。您正在尝试分配给变量 ,它是迭代变量。此赋值不会更改数组,因为变量是对当前数组元素的引用副本。如果你想正确初始化,你应该在与计数器的公共循环中执行此操作:threadthreadfor (int i = 0; i < threadArray.length; ++i) {&nbsp; &nbsp; UserThread newThread = new UserThread();&nbsp; &nbsp; threadArray[i] = newThread;&nbsp; &nbsp; threadArray[i].start();}之后,您似乎可以加入线程。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java