当前位置: 首页 > 知识库问答 >
问题:

ThreadPoolExecutor:拉出挂起的任务

乌璞瑜
2023-03-14

我已经实现了ThreadPoolExecutor来调用任务。而且,由于核心/队列大小的错误配置,任务似乎挂起在I/O上。我想拉出挂起的线程,以便队列中的其他线程开始执行。

有没有办法列出threadpoolexecutor中的线程并拉出挂起的线程

共有1个答案

公沈义
2023-03-14

您可以控制所使用的执行器,您可以使用ThreadPoolExecutor的beforeExecute和afterExecute方法来跟踪正在运行的任务,并使用它来创建getActiveTasks方法。

import java.util.Set;
import java.util.concurrent.*;


public class ActiveTasksThreadPool extends ThreadPoolExecutor {

private final ConcurrentHashMap<Runnable, Boolean> activeTasks = new ConcurrentHashMap<>();

public ActiveTasksThreadPool(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
    super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
}

@Override
protected void beforeExecute(Thread t, Runnable r) {

    activeTasks.put(r, Boolean.TRUE);
    super.beforeExecute(t, r);
}

@Override
protected void afterExecute(Runnable r, Throwable t) {

    super.afterExecute(r, t);
    activeTasks.remove(r);
}

public Set<Runnable> getActiveTasks() {
    // the returned set will not throw a ConcurrentModificationException.
    return activeTasks.keySet();
}

要使用Future设置线程任务超时,请执行以下操作:

 ActiveTasksThreadPool executor = new ActiveTasksThreadPool(maxTasks, maxTasks, 10, TimeUnit.SECONDS, new SynchronousQueue<Runnable>());Executors.newFixedThreadPool(2);

      List<Future<Integer>> resultList = new ArrayList<>();

      Random random = new Random();

      for (int i=0; i<4; i++)
      {
          Integer number = random.nextInt(10);
          FactorialCalculator calculator  = new FactorialCalculator(number);
          Future<Integer> result = executor.submit(calculator);
          result .get(100, TimeUnit.MILLISECONDS); // here is a timeout of 100 milisecond
      }
 类似资料:
  • 我使用spring boot with@Scheduled已经有一段时间了,但是最近我发现有一个潜在的危险威胁,如下所述:我发现当应用程序运行和计划任务运行几次时,有很多线程等待但没有完成,这在thread stacktrace中显示为'kill-3'。为了清除可能导致此问题的任何内容,我做了一个完全虚设的任务: 这是我的日志: 20151102 11:54:50.660信息池-3-线程-2---

  • 问题内容: 我正在使用ThreadPoolExecutor在Java应用程序中执行任务。我有一个要求,我想在任何时间获取执行者队列中队列中活动任务的数量。我查看了ThreadPoolExecutor 的javadoc,发现了两个相关方法:和。 根据文档,我可以分别通过上述两种方法获得计划任务和完成任务的数量。但是我找不到能够在任何时间获取队列中活动任务数量的解决方案。我可以做类似的事情: 但是失败

  • 我正在ThreadPoolExecutor中运行多个任务。我将其初始化如下: 我自己实现了runnable(),其中包含一个方法来跟踪提交任务的进度。我提交的实例如下: 我正在寻找一种查询当前/挂起线程的执行器/阻塞队列的方法。我尝试使用jobQueue。toArray()和重写executor方法但在这两种情况下,返回的Runnable都是FutureTask类型,不包含太多数据。有没有一种方法

  • 我的gradle构建挂在bootRepackage任务上。我的应用程序使用Gradle 2.14 Spring BootJava Gradle插件是 下面是我在gradle日志中看到的内容。bootRepackage任务执行受阻,没有错误: 执行的Gradle命令: 我添加了调试选项,但它没有给我任何额外的信息。请告诉我任何建议。

  • 问题内容: 我对ThreadPoolExecutor有一个非常简单的问题。我有以下情况:我必须使用队列中的对象,为它们创建适当的工作程序任务,然后将其提交给ThreadPoolExecutor。这很简单。但是在关闭情况下, 许多 工作人员可能会排队等待执行。由于这些任务之一可能正在运行一个小时,而且我希望相对快速地正常关闭应用程序,因此我想从ThreadPoolExecutor中丢弃所有排队的任务

  • 从java文档, ForkJoinPool不同于其他类型的ExecutorService,主要是因为它采用了工作窃取:池中的所有线程都试图查找并执行其他活动任务创建的子任务(如果不存在,则最终阻塞等待工作)。 当大多数任务产生其他子任务时(就像大多数ForkJoinTasks一样),这可以实现高效处理。当在构造函数中将asyncMode设置为true时,ForkJoinPools也可能适合用于从未