我在争论是否有任何意义将ExecutorService用于同一类的简单、动态增长的线程列表,所有这些线程始终处于活动状态。我了解Executors.newFixedThreadPool(int)提供了一个线程池,该线程池可以包含任意数量的线程,但只有方法中指定的数量在任何时间点都处于活动状态。我没有这样的限制,IOW 如果我添加 6 个线程,我希望所有 6 个线程同时运行。
如果使用它有优势,我应该仍然使用 Executors 框架,还是应该简单地将我的线程放在 ArrayList 中?
我在争论是否有任何意义将ExecutorService用于同一类的简单、动态增长的线程列表,所有这些线程始终处于活动状态。我了解Executors.newFixedThreadPool(int)提供了一个线程池,该线程池可以包含任意数量的线程,但只有方法中指定的数量在任何时间点都处于活动状态。我没有这样的限制,IOW 如果我添加 6 个线程,我希望所有 6 个线程同时运行。
如果使用它有优势,我应该仍然使用 Executors 框架,还是应该简单地将我的线程放在 ArrayList 中?
如果使用它有优势,我应该仍然使用 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);