我正在尝试编写一个解决方案,其中单个线程会产生可并行执行的I / O密集型任务。每个任务都有重要的内存数据。因此,我希望能够限制当前待处理的任务数。
如果我这样创建ThreadPoolExecutor:
ThreadPoolExecutor executor = new ThreadPoolExecutor(numWorkerThreads, numWorkerThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(maxQueue));
然后,当队列已满并且所有线程都已经繁忙时,executor.submit(callable)
抛出该异常RejectedExecutionException
。
executor.submit(callable)
当队列已满并且所有线程都忙时,我该怎么做才能阻塞?
编辑:我试过了:
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
它以某种微妙的方式达到了我想要达到的效果(基本上被拒绝的线程在调用线程中运行,因此这阻止了调用线程提交更多信息)。
编辑:(问了问题5年后)
对于阅读此问题及其答案的任何人,请勿将接受的答案作为一种正确的解决方案。请通读所有答案和评论。