【问题标题】:Java thread join()Java线程连接()
【发布时间】:2019-05-20 22:58:25
【问题描述】:

如果我有一个包含 10 个线程的数组准备好“使用”并且如果我有类似的东西

for (int i=0;i< MyThreadArray.length: i++){
MyThreadArray[i].start()
MyThreadArray.join()
}

如果线程 #6 的 sleep() 为 5 分钟,我如何在 #6 结束之前运行线程 #7?我必须等待#6 结束或者有一些指令来运行“下一个线程”?

【问题讨论】:

  • 你为什么打电话给join()?鉴于您的问题描述,您不想等待线程完成,但这正是调用 join() 所做的。因此,如果您不想等待,请不要致电join()。做你当前正在做的事情并不比只在当前线程上做工作更好。
  • t.join() 等待线程 t 在继续循环之前终止。这就是它在其他线程之前完成的原因。
  • 对于我的应用程序,我必须等待 n 线程结束,然后才能启动 (n+1) 线程。但是如果我有一个 sleep(),我可以运行 (n+1)-thread.... 我正在尝试这样做
  • "你必须等待n线程结束才能启动n + 1线程"那为什么还要使用线程呢?
  • 我试图更好地解释......我试图在一个系统无多线程(System-A)和一个系统多线程(System-B)之间执行一种集成。在我的应用程序中,我在 System-A 的一个特定事件之后运行一个线程,在继续之前,我必须等待 System-B 的线程执行结束。我可以有一个“例外”:如果运行的线程有 wait() 或 sleep() 我可以运行 System-B 的下一个线程

标签: java multithreading join wait


【解决方案1】:

使用两个循环。在第一个中,您应该启动所有线程:

for (int i=0;i< MyThreadArray.length: i++){
    MyThreadArray[i].start()
}

这将启动所有这些。之后,您想等待他们完成:

for (int i=0;i< MyThreadArray.length: i++){
    MyThreadArray[i].join()
    // notice    ^^^ you had a typo there
}

这将等待每个线程完成后再继续。

另外,请注意这个特殊的逻辑:

for (int i=0;i< MyThreadArray.length: i++){
    MyThreadArray[i].start()
    MyThreadArray[i].join()
}

只是使用并行的更糟糕的版本,因为它会顺序等待每个线程,另外增加了启动Thread的一些开销。 p>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2013-09-08
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-14
    相关资源
    最近更新 更多