Java 不带队列的ThreadPoolExecutor

Java 不带队列的ThreadPoolExecutor,java,queue,threadpool,Java,Queue,Threadpool,我想创建一个固定大小的线程池,它不允许任何任务进入它的队列。换句话说,如果线程池当前正在使用,那么传入的任务应该被彻底拒绝。基于,我认为,实现这一点的一种方法是创建一个拒绝接受任务的虚拟队列对象。用Java实现这一点的惯用方法是什么?您能详细说明一下为什么要这样做吗?TP+Q的基本目的是为工作提供一个自动“保持机制”,并将工人与工作创建过程分离。如果您的目的是只拥有与Worker一样多的可接受工作包,那么您实际上不需要TPE。您可以在ThreadPoolExector中使用一个线程池执行器,它是

我想创建一个固定大小的线程池,它不允许任何任务进入它的队列。换句话说,如果线程池当前正在使用,那么传入的任务应该被彻底拒绝。基于,我认为,实现这一点的一种方法是创建一个拒绝接受任务的虚拟队列对象。用Java实现这一点的惯用方法是什么?

您能详细说明一下为什么要这样做吗?TP+Q的基本目的是为工作提供一个自动“保持机制”,并将工人与工作创建过程分离。如果您的目的是只拥有与Worker一样多的可接受工作包,那么您实际上不需要TPE。

您可以在ThreadPoolExector中使用一个线程池执行器,它是一个不包含任何对象的队列。缓存的线程池使用它,因为它会根据需要创建新线程

如果它不能排队,但我建议使用在当前线程中运行任务。这样,它将始终“立即”运行

顺便说一句:弄清楚你为什么要这样做是很有用的

我想创建一个固定大小的线程池,它不允许任何任务进入它的队列

对于后代,如果您需要一个没有队列且运行所有作业(与OP稍有不同)的线程池,则可以使用
SynchronousQueue
,该线程池将阻塞,直到线程准备好执行作业为止。诀窍是使用一个
RejectedExecutionHandler
,它调用
put(…)
,将阻塞队列

threadPool = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime,
  unit, new SynchronousQueue<Runnable>(),
  new RejectedExecutionHandler() {
    @Override
    public void rejectedExecution(Runnable runnable, ThreadPoolExecutor executor){
      try {
        // this needs to be put(...) and not add(...)
        executor.getQueue().put(runnable);
      } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
      }
    }
  });
threadPool=newthreadpoolexecutor(corePoolSize、maximumPoolSize、keepAliveTime、,
单元,新的SynchronousQueue(),
新的RejectedExecutionHandler(){
@凌驾
public void rejectedExecution(Runnable Runnable,ThreadPoolExecutor executor){
试一试{
//这需要放置(…)而不是添加(…)
executor.getQueue().put(可运行);
}捕捉(中断异常e){
Thread.currentThread().interrupt();
}
}
});

您将能够提交作业,直到达到
maximumPoolSize
线程数,然后提交将被阻止,直到作业完成,并且有一个线程可从
SynchronousQueue

中退出队列。该任务可以从另一个线程池执行器(具有空闲线程)中提取,而不是排队等候前者。我应该使用什么来代替ThreadPoolExecutor?如果您想控制执行,那么TPE不是您的选择。你最好有一个简单的工作线程集合,你可以将任务交给它(如果它们可用的话),一个简单的集合,你可以构造它,并从主线程中拉入/推出线程。我们现在有一个这样的用例。如果某个节点有一个空闲工作节点,它可以接受新任务,否则其他节点将接受它,但该任务不应排队。如果排队,则不可能有其他节点。