我正在使用Executors
Java 中的框架为多线程应用程序创建线程池,并且我有一个与性能相关的问题。
我有一个可以在实时或非实时模式下工作的应用程序。如果它是实时的,我只是使用以下内容:
THREAD_POOL = Executors.newCachedThreadPool();
但如果它不是实时的,我希望能够控制我的线程池的大小。为此,我正在考虑 2 个选项,但我并不真正了解其中的区别,以及哪一个会表现得更好。
选项1是使用简单的方法:
THREAD_POOL = Executors.newFixedThreadPool(threadPoolSize);
选项 2 是像这样创建我自己的ThreadPoolExecutor
:
RejectedExecutionHandler rejectHandler = new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
try {
executor.getQueue().put(r);
} catch (Exception e) {}
}
};
THREAD_POOL = new ThreadPoolExecutor(threadPoolSize, threadPoolSize, 0, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(10000), rejectHandler);
我想了解使用更复杂的选项 2 的优势是什么,以及我是否应该使用其他数据结构而不是LinkedBlockingQueue
?任何帮助,将不胜感激。