java - 获取线程的输出

标签 java multithreading

您认为获取线程工作结果的最佳方式是什么?想象一个执行一些计算的线程,您如何警告主程序计算已完成?

您可以每隔 X 毫秒轮询一些名为“job finished”的公共(public)变量或顺便说一句,但是您收到结果的时间会晚于它们可用的时间……主要代码将浪费时间等待为他们。另一方面,如果您使用较低的 X,那么 CPU 会浪费很多次轮询。

那么,您如何才能知道线程或某些线程已完成其工作?

抱歉,如果它看起来与其他相似 question ,我想这可能是 eben 回答的原因。我的意思是运行大量线程并知道所有线程何时完成,而无需轮询它们。

我考虑的更多是在多个 CPU 使用线程批处理之间分担 CPU 负载,并知道批处理何时完成。我想这可以用 Futures 对象来完成,但是那个阻塞 get 方法看起来很像一个隐藏的锁,不是我喜欢的东西。

感谢大家的支持。虽然我也喜欢 erickson 的回答,但我认为 saua 是最完整的,也是我最喜欢的将在我自己的代码中使用。

最佳答案

除非您绝对需要强大的功能和灵 active ,否则不要使用线程等低级构造。

您可以使用 ExecutorService例如 ThreadPoolExecutorsubmit() Callables .这将返回 Future对象。

使用 Future 对象,您可以轻松检查它是否已完成并获得结果(如果尚未完成,则包括阻塞 get())。

这些构造将大大简化最常见的线程操作。

我想澄清一下阻塞 get():

这个想法是你想运行一些任务(Callables)来做一些你不需要结果的工作(计算,资源访问,......)现在。您可以只依赖 Executor 来在需要时运行您的代码(如果它是 ThreadPoolExecutor,那么它会在有空闲线程可用时运行)。然后在某个时间点您可能需要继续计算的结果。此时您应该调用 get()。如果此时任务已经运行,则 get() 将立即返回值。如果任务未完成,则 get() 调用将等待任务完成。这通常是需要的,因为无论如何您都无法在没有任务结果的情况下继续。

如果您不需要该值来继续,但想知道它是否已经可用(可能是为了在 UI 中显示一些内容),那么您可以轻松地调用 isDone()并且仅在返回 true 时调用 get()

关于java - 获取线程的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/352638/

相关文章:

java - 仅当子类强制转换为父类时才调用子类的方法?

java - 如何修复缺少 Artifact 的 POM?

Java 套接字 - 并行运行同一客户端多次。

java - 并行运行器跳过测试内的循环迭代

java - 如何获取.jar 中的资源?

java - 有没有办法在 Tomcat 中以编程方式将 SSL 设置为强制性的(例如,不通过 web.xml)?

java - 索引@MultiField spring-data-elasticsearch。国际化目的

C# - 使用 Thread.Sleep() 让我的循环每秒运行数百次

python - Google App Engine (GAE) 中的线程或后台进程

c - 这个信号量的实现是如何工作的?