我在辩论是否有一点使用ExecutorService来创建一个简单的,动态增长的同一类线程列表,所有这些线程始终都是活动的。我知道Executors.newFixedThreadPool(int)提供了一个线程池,它可以包含任意数量的线程,但只有方法中指定的数字在任何时间点都是活动的。我没有这样的限制,如果我添加6个线程,我希望所有6个并发运行。
我是否仍然使用Executors框架,如果使用它有优势,或者我应该简单地将我的线程放在ArrayList中?
答案 0 :(得分:2)
我是否仍然使用Executors框架,如果使用它有优势,或者我应该简单地将我的线程放在ArrayList中?
很多人分叉并管理自己的线程。但是,推荐ExecutorService
类的主要原因是它们负责管理线程和相关任务,并减少必须编写,调试和维护的代码量。显然,它们提供了许多其他功能,例如Callable
支持,完成服务等,您可能不会使用它们。但是,将管理层留给这些核心类,即使是简单的项目,本身也是一件好事。我甚至为单线程池使用它们,因为我想要线程池的Runnable
任务队列功能,而不是编写我自己的BlockingQueue
或其他机制。
如果我添加6个线程,我希望所有6个线程同时运行。
然后你应该使用Executors.newCachedThreadPool()
。如果您向其提交6个作业(Runnable
或Callable
的实例),则将启动6个线程来处理它们。如果3个作业完成并且其他作业已提交,则3个休眠线程将运行其他作业。
注意:如果您要提交1000个作业,您将启动1000个线程,这很可能不您想要做什么。
例如,自己编写代码需要更多代码:
// a pool of 10 threads
ExecutorService threadPool = Executors.newFixedThreadPool(10);
// submit a bunch of jobs to they 10 threads for processing
for (MyJob job : jobsToDo) {
threadPool.submit(job);
}
// no more tasks are being submitted so shutdown the pool
threadPool.shutdown();
// wait for the jobs to finish
threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);