【问题标题】:Multithreading Java - Joins多线程 Java - 连接
【发布时间】: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


【解决方案1】:

您设计代码的方式是错误的。使用Thread#join 将停止当前线程的执行,直到正在执行的线程完成。

代码应该是这样设计的:

List<UserThread> userThreadList = new ArrayList<UserThread>();
for (User user : users) {
    UserThread uT = new UserThread(user);
    uT.start();
    userThreadList.add(uT);
}

for (UserThread uT : userThreadList) {
    try
    {
        uT.join();
    }
    catch (InterruptedException e)
    {
        System.out.println(e.getMessage());
    }
}

请注意,这些任务最好使用ExecutorService,而不是尝试手动实现。

【讨论】:

  • 非常感谢路易吉!它就像我想要的那样工作。感谢您的帮助,我现在对多线程以及我应该如何处理多个线程有了更多的了解。我还将听取您的建议,并为我的下一个程序查看 ExecutorService。再次感谢!
【解决方案2】:

不完全是,因为您的连接与开始在同一个循环中,它会等待线程完成,然后再开始下一个。

您需要两个循环来完成此操作。一个启动线程并将它们存储在某个集合中,另一个循环遍历集合并加入每个线程。

【讨论】:

  • 或使用ExecutorService
猜你喜欢
  • 2023-03-26
  • 2020-09-17
  • 2019-05-20
  • 1970-01-01
  • 1970-01-01
  • 2013-05-23
  • 2018-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多