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

时间:2009-12-25 09:03:08

标签: java multithreading

好标题说,Executors.newSingleThreadExecutor().execute(command)new Thread(command).start();

之间有什么区别

6 个答案:

答案 0 :(得分:39)

行为上,几乎没有。

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

答案 1 :(得分:21)

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

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

答案 2 :(得分:12)

使用Executor.execute,如果在Error中抛出RuntimeExceptionExecutor,则会以静默方式吞下它,而new Thread()会将其打印到{ {1}}。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

查看ExecutorService&相关SE问题中的ThreadPoolExecutor部分:

java Fork/Join pool, ExecutorService and CountDownLatch

Java's Fork/Join vs ExecutorService - when to use which?

假设您已经开始使用自己的线程而不是ExecutorService。将来,如果需要支持多个线程,ExecutorServiceThreadPoolExecutor将为您提供更好的控制和灵活性。您可以在以下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]单线程执行程序还提供了足够的内部   同步以确保任务执行的任何内存写入   对后续任务可见;这意味着物体可以安全地   限制在“任务线程”中,即使该线程可能被替换   不时与另一个人联系。