【发布时间】:2015-02-06 19:42:54
【问题描述】:
我是 java 中的多线程新手,想确认以下代码是否可以正常工作。
// Inside class Menu
for (User user : users)
{
UserThread uT = new UserThread(user);
uT.start();
try
{
uT.join();
}
catch (InterruptedException e)
{
System.out.println(e.getMessage());
}
}
因此,对于名为 users 的数组列表中的每个用户,都会创建并启动一个新线程。然后uT.Join() 用于告诉Menu 类等待线程完成才能继续。对吗?
在没有uT.Join() 的情况下,多线程可以成功运行,但是 Menu 类将显示一个菜单,并且它会与也打印出某些内容的其他线程发生冲突。同样没有连接,线程并不总是以相同的顺序打印出来,但是当使用连接时,它们似乎总是以相同的顺序打印,这让我很担心。
我不确定的是,uT.Join() 是只要求显示菜单的主线程等待还是要求其他用户线程等待?我希望我的线程是并发的,并且不会以任何方式相互阻碍。
PS:我确实意识到这个问题有多个主题,对于在集合中添加另一个主题,我深表歉意,但我无法找到一个我可以完全理解的主题。
感谢阅读,如果我遗漏了任何应该添加的信息,请随时通知我。
【问题讨论】:
-
uT.join()一直等到uT线程终止。它对 uT 线程或除调用它的线程之外的任何其他线程没有影响。 -
您的循环启动一个线程,然后等待它终止,然后再启动下一个线程。如果您希望线程并行运行,那么您将需要两个循环。第一个循环应该启动线程并将它们添加到
List<Thread>。然后第二个循环应该join()列表中的每个线程。 -
另外,请注意 class 不会等待线程——只有 thread 等待线程。该类也只是概念中漂浮的一些元数据,“这就是菜单。”
标签: java multithreading join