ThreadPoolExecutor:拉出挂起的任务

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ThreadPoolExecutor:拉出挂起的任务相关的知识,希望对你有一定的参考价值。

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

有什么方法可以列出线程池执行器中的线程并拉出挂起的线程吗?

答案

您可以控制使用的执行程序,可以使用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
      

以上是关于ThreadPoolExecutor:拉出挂起的任务的主要内容,如果未能解决你的问题,请参考以下文章

vs2013-执行签入挂起的更改,提示没有挂起的更改(实际代码已修改)

ThreadPoolExecutor 挂起

Powershell:获取所有挂起的任务

如何在 Angular 4+ 中取消/取消订阅所有挂起的 HTTP 请求

如何使可能挂起的分叉进程超时?

linux C 当前进程运行10ms后挂起的功能如何实现.