我正在尝试编写一个解决方案,其中单个线程产生可以并行执行的I/O密集型任务。每个任务都有大量的内存数据。因此,我希望能够限制当前挂起的任务的数量。
如果我像这样创建ThreadPoolExecutor:
ThreadPoolExecutor executor = new ThreadPoolExecutor(numWorkerThreads, numWorkerThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue(maxQueue));
然后executor.submit(callable)
抛出RejectedExecutionException
当队列填满并且所有线程都已经很忙时。
我能做些什么executor.submit(callable)
是否在队列已满且所有线程都繁忙时阻塞?
编辑:我试过了this
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
它在某种程度上达到了我想要的效果,但以一种不优雅的方式(基本上被拒绝的线程在调用线程中运行,因此这阻止了调用线程提交更多线程)。
编辑:(提问5年后)
对于任何阅读此问题及其答案的人,请不要将接受的答案视为一个正确的解决方案。请通读所有答案和评论。
https://stackoverflow.com/questions/4521983
复制相似问题