有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

不带队列的java ThreadPoolExecutor

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


共 (1) 个答案

  1. # 1 楼答案

    I want to create a fixed-size thread pool that admits no task into its queue.

    对于后代来说,如果您需要一个没有队列的线程池,并且运行所有作业(与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();
          }
        }
      });
    

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