您认为获取线程工作结果的最佳方式是什么?想象一个线程执行一些计算,如何警告主程序计算已完成?
您可以每隔 X 毫秒轮询一些名为“作业完成”的公共变量或顺便说一句,但是您会收到比可用结果更晚的结果……主代码将浪费时间等待它们。另一方面,如果您使用较低的 X,CPU 将浪费多次轮询。
那么,您如何知道线程或某些线程已完成其工作呢?
抱歉,如果它看起来与其他类似question https://stackoverflow.com/questions/289434/how-to-make-a-java-thread-wait-for-another-threads-output,这可能就是原因eben回答,我想。我的意思是运行大量线程并知道所有线程何时完成,而不需要轮询它们。
我更多地考虑使用批次线程在多个 CPU 之间共享 CPU 负载,并知道批次何时完成。我想这可以用Futures 对象,但是阻塞get方法看起来很像隐藏的锁,不是我喜欢的。
感谢大家的支持。虽然我也喜欢这个答案erickson, 我认为saua是最完整的,我将在自己的代码中使用它。
不要使用低级结构,例如线程,除非您绝对需要强大的功能和灵活性。
您可以使用执行服务 http://java.sun.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html如那个线程池执行器 http://java.sun.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html to submit() http://java.sun.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html#submit(java.util.concurrent.Callable) 可调用对象 http://java.sun.com/javase/6/docs/api/java/util/concurrent/Callable.html。这将返回一个Future http://java.sun.com/javase/6/docs/api/java/util/concurrent/Future.html object.
使用那个Future
对象,您可以轻松检查它是否完成并获取结果(包括阻塞get()
如果尚未完成)。
这些构造将极大地简化最常见的线程操作。
我想澄清一下屏蔽的情况get()
:
这个想法是你想要运行一些任务(Callable
s) 执行一些您现在不需要结果的工作(计算、资源访问等)。你可以只依靠Executor
随时运行您的代码(如果它是ThreadPoolExecutor
那么只要有空闲线程可用,它将运行)。然后在某个时间点,您可能需要计算结果才能继续。此时你应该调用get()
。如果此时任务已经运行,那么get()
将立即返回值。如果任务没有完成,那么get()
调用将等待,直到任务完成。这通常是所希望的,因为无论如何,如果没有任务结果,您就无法继续。
当您不需要该值来继续,但想知道它是否已经可用(可能在 UI 中显示某些内容)时,您可以轻松调用isDone()
并且只调用get()
如果返回true
).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)