程序的主流程是 线程池A fetch数据,然后线程池 B delete数据
public void init() {
final String fetchPoolName = "fetch-pool";
fetchVsearchDataExecutor = new ThreadPoolExecutor(4, threadNum, 10, TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(20), new NameThreadFactory(fetchPoolName),
new ThreadPoolExecutor.DiscardPolicy());
final String deletePoolName = "delete-pool";
deleteVsearchDataExecutor = new ThreadPoolExecutor(4, threadNum, 10, TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(20), new NameThreadFactory(deletePoolName),
new BlockRejectedExecutionHandler<Runnable>(deletePoolName));
}
假如:fetch线程很耗时,fetch的线程池 的RejectedExecutionHandler handler 使用ThreadPoolExecutor.CallerRunsPolicy()或者类似假如阻塞队列当前线程处理,在同时加入线程数 > maximumPoolSize+BlockingQueue.size() 会导致主线程堵塞,程序无法执行下去,删除线程无法添加到线程池中,删除线程无法执行。这样就需要考虑fetch线程池的阻塞队列的长度要大于fetch线程数,考虑是否要丢弃过多的fetch线程,以保证删除线程能够顺利得到执行。