在Java程序中使用Executors而不仅仅是Threads有什么好处。
如
ExecutorService pool = Executors.newFixedThreadPool(2);
void someMethod() {
//Thread
new Thread(new SomeRunnable()).start();
//vs
//Executor
pool.execute(new SomeRunnable());
}
执行程序是否只限制允许一次运行的线程数(线程池)?它是否实际上将runnable复用到它创建的线程上?如果不是,它只是一种避免每次都必须编写新的Thread(runnable).start()的方法吗?
答案 0 :(得分:7)
是的,执行者通常会将runnable复用到他们创建的线程上;他们会限制和管理一次运行的线程数量;他们会更容易定制并发级别。通常,执行程序应该优先于创建裸线程。
答案 1 :(得分:5)
创建新线程非常昂贵。因为Executors使用线程池,所以可以轻松地重用线程,从而提高性能。
答案 2 :(得分:2)
执行程序是否只限制允许一次运行的线程数(线程池)?
Executors#newFixedThreadPool(int)
,Executors#newSingleThreadExecutor
执行此操作,每个人都使用不同的术语(阅读正确的javadoc以了解更多信息)。
它是否实际上将runnable复用到它创建的线程上?
是
如果不是,它只是一种避免每次都必须编写新线程(可运行).start()的方法吗?
ExecutorService
可帮助您控制处理线程的方式。当然,您可以手动执行此操作,但无需重新发明轮子。此外,ExecutorService
还提供了其他功能,可以通过使用Future
实例来执行异步任务。
答案 3 :(得分:0)
有多个与线程相关的问题。
Executors提供了用于创建线程池的不同类型的实现。线程创建也是一件昂贵的事情。执行程序在内部创建和管理这些线程。有关它的详细信息可以在下面的链接中找到。 http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html
答案 4 :(得分:-1)
正如我在a related question中所说,线程非常糟糕。执行程序(以及相关的并发类)非常好:
警告:在这里,我强烈反对使用原始线程。一世 更喜欢使用Callables和FutureTasks(来自javadoc:“A 可取消的异步计算“)。超时的集成, 正确的取消和现代并发的线程池 支持对我来说比成堆的原始线程更有用。
例如,我正在使用自定义替换使用在循环中运行的不相交Thread的遗留代码,以确定每次迭代后Thread.sleep()应该多长时间。我的替换将使用非常简单的Runnable(进行单次迭代),ScheduledExecutorService运行其中一次迭代,Future生成scheduleAtAFixedRate来调整迭代之间的时间
虽然您可能会认为替换将有效地等同于遗留代码,但我将用一系列分离GUI关注点的功能替换一个神秘的线程管理和一厢情愿的想法(我们目前正在运行) ?)来自数据处理(以5倍速播放)和文件管理(取消此运行并选择另一个文件)。