1

我在争论是否有任何意义将ExecutorService用于同一类的简单、动态增长的线程列表,所有这些线程始终处于活动状态。我了解Executors.newFixedThreadPool(int)提供了一个线程池,该线程池可以包含任意数量的线程,但只有方法中指定的数量在任何时间点都处于活动状态。我没有这样的限制,IOW 如果我添加 6 个线程,我希望所有 6 个线程同时运行。

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

4

1 回答 1

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);
于 2013-07-24T19:19:02.333 回答