好标题说,Executors.newSingleThreadExecutor().execute(command)
和new Thread(command).start();
答案 0 :(得分:39)
行为上,几乎没有。
但是,一旦有了Executor
实例,就可以向其提交多个任务,并让它们一个接一个地执行。你不能简单地使用原始Thread
。
答案 1 :(得分:21)
一个明显的区别是,当runnable完成后运行new Thread(someRunnable).start();
时,线程将静静地死亡。
Executor会一直持续到关闭它为止。因此运行Executors.newSingleThreadExecutor().execute(command)
当您认为您的应用程序或JVM可能已完成时,Executor可能仍在后台线程中运行。
答案 2 :(得分:12)
使用Executor.execute
,如果在Error
中抛出RuntimeException
或Executor
,则会以静默方式吞下它,而new Thread()
会将其打印到{ {1}}。
答案 3 :(得分:0)
Executors.newSingleThreadExecutor()。execute(command)将重用以前构造的线程,它不会像新的Thread()那样创建新线程。如果未使用60秒的线程终止,它是一种包含单个线程的池,它使其等效于newFixedThreadPool(1)。
答案 4 :(得分:0)
我更喜欢使用ExecutorService
或ThreadPoolExecutor
,即使对于单位数线程也是如此。它们提供了更大的灵活性。
查看ExecutorService
&相关SE问题中的ThreadPoolExecutor
部分:
java Fork/Join pool, ExecutorService and CountDownLatch
Java's Fork/Join vs ExecutorService - when to use which?
假设您已经开始使用自己的线程而不是ExecutorService
。将来,如果需要支持多个线程,ExecutorService
或ThreadPoolExecutor
将为您提供更好的控制和灵活性。您可以在以下API中微调所需数量的参数。
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,
TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory,
RejectedExecutionHandler handler)
答案 5 :(得分:0)
可能会有很多差异,但是我将向您展示一个我发现非常重要的差异:
public void sendEventSingleThreadExecutor(Event e){
Executor.singleThreadExecutor().execute(()->{//send the event here})
}
现在,即使您调用 sendEventSingleThreadExecutor方法 10次,它也会仅使用一个线程发送它们。它不会每次都创建一个新线程。这意味着事件将被顺序或同步发送! 您可以从here阅读更多内容:
现在请看下面带有新线程的示例
public void sendEventThread(Event e){
Thread(//send the event here).start();
}
如果您调用10次,它将创建 10个新线程。这意味着执行将是异步!并且可能很危险,它可以创建很多线程,具体取决于您调用sendEventThread函数的次数。
请注意,该代码仅用于演示目的,可能存在语法错误! 如果您在此处发现任何错误的描述,我们很乐意予以纠正。
来自here
的更多信息newSingleThreadExecutor。单线程执行程序创建一个 工作线程来处理任务,如果它意外死亡,则将其替换。 保证根据任务顺序处理任务 任务队列强加的顺序(FIFO,LIFO,优先级顺序)。[4]
[4]单线程执行程序还提供了足够的内部 同步以确保任务执行的任何内存写入 对后续任务可见;这意味着物体可以安全地 限制在“任务线程”中,即使该线程可能被替换 不时与另一个人联系。