Cha*_*guy 8 java multithreading executorservice threadpool
我Executors在Java中使用框架为多线程应用程序创建线程池,我有一个与性能相关的问题.
我有一个可以在实时或非实时模式下工作的应用程序.如果它是实时的,我只是使用以下内容:
THREAD_POOL = Executors.newCachedThreadPool();
Run Code Online (Sandbox Code Playgroud)
但是,如果它不是实时的,我希望能够控制我的线程池的大小.要做到这一点,我正在考虑两个选项,但我并不真正理解其中的差异,哪个会更好.
选项1是使用简单的方法:
THREAD_POOL = Executors.newFixedThreadPool(threadPoolSize);
Run Code Online (Sandbox Code Playgroud)
选项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);
Run Code Online (Sandbox Code Playgroud)
我想了解使用更复杂的选项2的优点是什么,以及我是否应该使用其他数据结构LinkedBlockingQueue?任何帮助,将不胜感激.
Tom*_*icz 14
查看源代码,您将意识到:
Executors.newFixedThreadPool(threadPoolSize);
Run Code Online (Sandbox Code Playgroud)
是等价于:
return new ThreadPoolExecutor(threadPoolSize, threadPoolSize, 0L, MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
Run Code Online (Sandbox Code Playgroud)
由于它不提供显式RejectedExecutionHandler,AbortPolicy因此使用默认值.RejectedExecutionException一旦队列满了,它基本上会抛出.但是队列是无限的,所以它永远不会满.因此,这个执行器接受1个任务数量.
你的声明要复杂得多,而且完全不同:
new LinkedBlockingQueue<Runnable>(10000) 如果等待的次数超过10000,将导致线程池丢弃任务.
我不明白你RejectedExecutionHandler在做什么.如果池发现它无法将更多的runnables放入队列,则会调用您的处理程序.在这个处理程序中你...尝试再次将其Runnable放入队列中(这将是99%的案件都失败了块).最后你吞下了这个例外.好像ThreadPoolExecutor.DiscardPolicy是你所追求的.
如果任务队列太大,看下面的评论似乎是你试图阻止或以某种方式限制客户端.我不认为阻止内部RejectedExecutionHandler是一个好主意.而是考虑CallerRunsPolicy拒绝政策.不完全相同,但足够接近.
总结:如果你想限制挂起任务的数量,你的方法几乎是好的.如果你想限制并发线程的数量,第一个单线程就足够了.
1 - 假设2 ^ 31是无穷大
| 归档时间: |
|
| 查看次数: |
7370 次 |
| 最近记录: |