使用ExecutorService / ThreadPool获取始终活动线程的简单变量列表

时间:2013-07-24 19:13:50

标签: java multithreading concurrency executorservice

我在辩论是否有一点使用ExecutorService来创建一个简单的,动态增长的同一类线程列表,所有这些线程始终都是活动的。我知道Executors.newFixedThreadPool(int)提供了一个线程池,它可以包含任意数量的线程,但只有方法中指定的数字在任何时间点都是活动的。我没有这样的限制,如果我添加6个线程,我希望所有6个并发运行。

我是否仍然使用Executors框架,如果使用它有优势,或者我应该简单地将我的线程放在ArrayList中?

1 个答案:

答案 0 :(得分:2)

  

我是否仍然使用Executors框架,如果使用它有优势,或者我应该简单地将我的线程放在ArrayList中?

很多人分叉并管理自己的线程。但是,推荐ExecutorService类的主要原因是它们负责管理线程和相关任务,并减少必须编写,调试和维护的代码量。显然,它们提供了许多其他功能,例如Callable支持,完成服务等,您可能不会使用它们。但是,将管理层留给这些核心类,即使是简单的项目,本身也是一件好事。我甚至为单线程池使用它们,因为我想要线程池的Runnable任务队列功能,而不是编写我自己的BlockingQueue或其他机制。

  

如果我添加6个线程,我希望所有6个线程同时运行。

然后你应该使用Executors.newCachedThreadPool()。如果您向其提交6个作业(RunnableCallable的实例),则将启动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);