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

30 java multithreading

好标题说,它Executors.newSingleThreadExecutor().execute(command)和之间有什么区别new Thread(command).start();

ska*_*man 40

在行为上,几乎没有任何东西.

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


Joh*_*int 21

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

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


Pet*_*rey 13

随着Executor.execute,如果一个Error或被RuntimeException抛出Executor它将被静默吞噬,而new Thread()将打印它System.err.

  • 为了避免执行程序吞下异常,一种解决方案是调用“Executor.submit”而不是“execute”,然后在您想要处理潜在错误时在结果“Future”上调用“get”。 (3认同)

Jun*_*aed 7

可能存在很多差异,但我将向您展示一个我认为理解非常重要的差异:

\n\n
public void sendEventSingleThreadExecutor(Event e){\n  Executor.singleThreadExecutor().execute(()->{//send the event here})\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在,即使您调用sendEventSingleThreadExecutor 方法10 次,它也只会使用单个线程来发送它们。它不会每次都创建一个新线程。这意味着事件将按顺序或同步发送!\n您可以从这里阅读更多信息:

\n\n

现在看下面带有新线程的示例

\n\n
public void sendEventThread(Event e){\n  Thread(//send the event here).start();\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果调用它 10 次,它将创建10 个新线程。这意味着,执行将是异步的!这可能很危险,它可以创建很多线程,具体取决于您调用 sendEventThread 函数的次数。

\n\n

请注意,代码仅用于演示目的,可能存在语法错误!\n如果您发现此处的描述有任何错误,我将很乐意予以纠正。

\n\n

更多信息请点击这里

\n\n
\n

新的单线程执行器。单线程执行器创建一个\n工作线程来处理任务,如果它意外终止,则替换它。\n保证任务按照任务队列规定的\n顺序(先进先出、后进先出、优先级顺序)顺序处理。 ).[4]

\n\n

[4] 单线程执行器还提供足够的内部同步,以保证任务进行的任何内存写入对后续任务可见;这意味着对象可以安全地限制在\xe2\x80\x9c任务线程\xe2\x80\x9d中,即使该线程可能不时被另一个线程替换。

\n
\n