gpt4 book ai didi

java - ThreadPool 中的 Runnable 与线程内和 ThreadPool 中的 Runnable 之间有什么区别

转载 作者:行者123 更新时间:2023-12-02 09:34:36 26 4
gpt4 key购买 nike

这有什么区别?请引用选项1和选项2。因为我遇到了麻烦,因为它们好像是一样的。它们运行正确

Thread

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 程序员在阅读您的代码时产生“到底是什么东西”的 react 。你不想要这样。弄清楚“奇怪”的代码在做什么是浪费人们的时间。

<小时/>

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

它比选项 1 和 2 都更糟糕。您现在不再使用线程池,而是为每个任务启动一个新线程。这效率要低得多。线程启动和退出的开销以数千个时钟周期为单位...

关于java - ThreadPool 中的 Runnable 与线程内和 ThreadPool 中的 Runnable 之间有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57643578/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com