Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Executors.newSingleThreadExecutor().execute(命令)和new Thread(命令).start()之间的差异;_Java_Multithreading - Fatal编程技术网

Java Executors.newSingleThreadExecutor().execute(命令)和new Thread(命令).start()之间的差异;

Java Executors.newSingleThreadExecutor().execute(命令)和new Thread(命令).start()之间的差异;,java,multithreading,Java,Multithreading,好吧,标题说,Executors.newSingleThreadExecutor().execute(command)和newthread(command.start()之间有什么区别行为上,几乎没有什么 但是,一旦有了一个Executor实例,就可以向它提交多个任务,并让它们一个接一个地执行。如果执行器中抛出错误或运行时异常,则不能简单地使用执行器的原始线程执行,它将被默默吞没,而新线程()将打印到系统。err一个明显的区别,是当您运行新线程(someRunnable).start()时当ru

好吧,标题说,
Executors.newSingleThreadExecutor().execute(command)
newthread(command.start()之间有什么区别

行为上,几乎没有什么


但是,一旦有了一个
Executor
实例,就可以向它提交多个任务,并让它们一个接一个地执行。如果
执行器中抛出
错误
运行时异常
,则不能简单地使用
执行器的原始
线程执行
,它将被默默吞没,而
新线程()
将打印到
系统。err
一个明显的区别,是当您运行新线程(someRunnable).start()时当runnable完成时,线程将安静地消亡


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

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

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

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

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

ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, 
TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory,
RejectedExecutionHandler handler)
ThreadPoolExecutor(int-corePoolSize、int-maximumPoolSize、long-keepAliveTime、,
时间单位、BlockingQueue工作队列、ThreadFactory ThreadFactory、,
RejectedExecutionHandler(处理程序)

可能有很多不同之处,但我将向您展示一个我认为非常重要的区别:

public void sendEventSingleThreadExecutor(Event e){
  Executor.singleThreadExecutor().execute(()->{//send the event here})
}
现在,即使您调用sendEventSingleThreadExecutor方法10次,它也只会使用一个线程来发送它们。它不会每次都创建一个新线程。这意味着事件将按顺序或同步发送! 您可以阅读以下内容:

现在,请参见下面的新线程示例

public void sendEventThread(Event e){
  Thread(//send the event here).start();
}
如果调用它10次,它将创建10个新线程。这意味着,执行将是异步的!而且它可能是危险的,它会根据调用sendEventThread函数的次数创建大量线程

请注意,代码仅用于演示,可能有语法错误! 如果您在这里发现任何错误的描述,我将很乐意更正。

更多信息请访问

newSingleThreadExecutor。单线程执行器创建一个 工作线程来处理任务,如果任务意外死亡,则替换它。 任务保证按照顺序处理 任务队列施加的顺序(先进先出、后进先出、优先级顺序)。[4]

[4] 单线程执行器还提供足够的内部 同步以确保任务所做的任何内存写入都是同步的 对后续任务可见;这意味着对象可以安全地访问 仅限于“任务线程”,即使该线程可能被替换 不时地和另一个人在一起


显然不是这样:有趣的是,我对他说的话没什么异议。在
submit
完成后,我无法重新创建
finalize
调用。我运行了一个简单的
main
测试,委托的TPE从来都不是GC'd。老实说,我还没有对它进行测试。为了避免异常被执行者吞没,一个解决方案是调用
executor.submit
而不是
execute
,如果您想处理潜在的错误,请调用
get
,查看结果
Future
。@li感谢您的澄清。“从行为上讲,几乎没有什么。”这是完全错误的说法。有巨大的行为差异。下面是我的答案,关于线程的重用和创建多个线程的区别是什么?