我正在尝试编写一个解决方案,其中一个线程产生可以并行执行的 I/O 密集型任务。每个任务都有重要的内存数据。因此,我希望能够限制任务的数量,在一个时刻挂起。
如果我像这样创建 ThreadPoolExecator:
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年后)
对于任何阅读这个问题及其答案的人,请不要把接受的答案当作一个正确的解决方案。请仔细阅读所有的回答和评论。