[英]What is Difference between Runnable in a ThreadPool vs Runnable inside a Thread and in a ThreadPool
这有什么区别? 请参阅选项1和选项2。 因为我遇到了麻烦,因为就像他们一样。 他们运行正常
ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(4);
Thread callLogsThread = new Thread(new CallLogsRunnable());
Thread contactsThread = new Thread(new ContactsRunnable());
/*option 1**/
executor.submit(new ContactsRunnable());
executor.submit(new CallLogsRunnable());
/*option 2**/
executor.submit(contactsThread);
executor.submit(callLogsThread);
/*option 3**/
contactsThread.start();
contactsThread.join();
callLogsThread.start();
callLogsThread.join();
executor.shutdown();
更新:我添加了选项3。现在选项1和选项3之间有什么区别。原因我知道选项2是废话。 谢谢
从功能/行为的角度来看,没有区别。 在Thread
对象上调用run()
将调用作为构造函数参数传递的Runnable
; 参见javadoc的Thread::run()
。
从效率的角度来看,第二个选项创建不必要的Thread
对象。 这会降低性能,增加内存利用率并增加GC负载。
(对效率的影响很小,但是由于Thread
对象什么也做不了...。只是不要做。)
从可读性/可维护性的角度来看,第二种选择将引起任何经验丰富的Java程序员阅读您的代码的“到底是什么”的反应。 你不要那样 浪费人们的时间去弄清楚“奇怪的”代码在做什么。
您在start()
线程中添加了第三个选项,而不是在线程池中使用现有线程。
它比选项1和2都差。现在,您无需使用线程池,而是为每个任务启动一个新线程。 这样效率低得多 。 以数千个时钟周期来衡量线程启动和退出的开销。
如评论所述,选项2)仅由于Thread
实现Runnable
才起作用,其中run
方法是线程应执行的操作。
如果将Thread
传递给执行程序,它将调用Thread
的run()
方法-但是实际的Thread
本身不会带来任何好处。 因此,选项2)是错误的。
如果要callLogsThread.start()
Runnable
,请直接使用callLogsThread.start()
-然后不要忘记在线程完成后将其join()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.