假设一个控制线程可以访问一堆线程以及该线程将等待的对象。如果我必须从这个单一控制线程启动和停止,其中几个线程正在做什么,哪一个会对性能产生更大的影响?
例如通过中断杀死它并使用相同的 Runnable 创建一个新的不是更好吗?
最佳答案
创建(实际上是start()
-ing)一个新线程相对昂贵,因此从性能角度来看,最好使用wait
/notify
.
其次,中断
不能保证“停止”线程。线程可能会选择忽略中断...或者如果它纯粹受 CPU 限制,则可能根本不会注意到它。
还有第三种选择:使用现有的线程池机制。例如,ExecutorService API 有多种提供有界和无界线程池的实现。这些可以负责扩展和缩小以及池关闭。您可以通过submit(...)
将任务用作Runnable
实例来使用它们,并且您可以选择获得一个Future
,它允许您等待任务完成。
最后,对于大多数并发编程用例,都有支持该用例的标准类,最好使用它们而不是尝试从头开始实现;例如直接使用等待/通知。在您的情况下,您可能需要某种“屏障”机制:java.util.concurrent.Phaser
可能就是您需要的。
关于java - 创建和终止线程与使用 .notify() 和 .wait(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26580984/