繁体   English   中英

ThreadPool中的Runnable与Thread和ThreadPool中的Runnable有什么区别

[英]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 参见javadocThread::run()

从效率的角度来看,第二个选项创建不必要的Thread对象。 这会降低性能,增加内存利用率并增加GC负载。

(对效率的影响很小,但是由于Thread对象什么也做不了...。只是不要做。)

从可读性/可维护性的角度来看,第二种选择将引起任何经验丰富的Java程序员阅读您的代码的“到底是什么”的反应。 你不要那样 浪费人们的时间去弄清楚“奇怪的”代码在做什么。


您在start()线程中添加了第三个选项,而不是在线程池中使用现有线程。

它比选项1和2都差。现在,您无需使用线程池,而是为每个任务启动一个新线程。 这样效率低得多 以数千个时钟周期来衡量线程启动和退出的开销。

如评论所述,选项2)仅由于Thread实现Runnable才起作用,其中run方法是线程应执行的操作。

如果将Thread传递给执行程序,它将调用Threadrun()方法-但是实际的Thread本身不会带来任何好处。 因此,选项2)是错误的。

如果要callLogsThread.start() Runnable ,请直接使用callLogsThread.start() -然后不要忘记在线程完成后将其join()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM