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感谢您的澄清。“从行为上讲,几乎没有什么。”这是完全错误的说法。有巨大的行为差异。下面是我的答案,关于线程的重用和创建多个线程的区别是什么?