我想这是另一个答案,因为它对同一个问题有不同的解决方案。
您只能使用ThreadPoolExecutor和Semaphore。信号量将使用您希望在队列中允许的最大数量创建,并且在每个线程完成执行后,您将调用release(beforeExecute,即项目从队列中取出时)
Semaphore semaphore = new Semaphore(1000);
ThreadPoolExecutor executor = new ThreadPoolExecutor(5,10,60,TimeUnit.SECONDS,new LinkedBlockingQueue()){
protected void beforeExecute(Runnable r, Throwable t) {
semaphore.release();
}
}
public void doSubmit(Runnable r){
sempahore.acquire();
executor.submit(r);
}
</code>
所以这里所有线程都将暂停,直到有可用的许可证(队列中的条目)。