Executors.newSingleThreadExecutor()。执行(命令)和新线程(命令).start()之间的区别;

好吧标题说, Executors.newSingleThreadExecutor().execute(command)new Thread(command).start();之间的区别是什么new Thread(command).start();

行为上,几乎没有。

但是,一旦有了Executor实例,就可以向其提交多个任务,并让它们一个接一个地执行。 你不能简单地使用原始Thread来做到这一点。

一个明显的区别是,当你运行new Thread(someRunnable).start(); 当runnable完成后,线程将静静地死亡。

Executor会一直持续到你关闭它为止。 因此运行Executors.newSingleThreadExecutor().execute(command)当您认为您的应用程序或JVM可能已完成时,Executor可能仍在后台线程中运行。

如果在Executor中抛出Error或RuntimeException,它将被静默吞下,新的Thread()将它打印到System.err

Executors.newSingleThreadExecutor()。execute(command)将重用以前构造的线程,它不会像新的Thread()那样创建新线程。 如果未使用60秒的线程终止,它是一种包含单个线程的池,它使其等效newFixedThreadPool(1)。

我更喜欢使用ExecutorServiceThreadPoolExecutor即使对于单位数线程也是如此。 它们提供更多灵活性。

查看相关SE问题中的ExecutorServiceThreadPoolExecutor部分:

java Fork / Join池,ExecutorService和CountDownLatch

Java的Fork / Join vs ExecutorService – 何时使用哪个?

假设您已经开始使用自己的线程而不是ExecutorService 。 将来,如果需要支持多个线程, ExecutorServiceThreadPoolExecutor将为您提供更好的控制和灵活性。 您可以在以下API中微调所需数量的参数。

 ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)