【发布时间】:2020-07-22 22:24:16
【问题描述】:
我已经实现了 ThreadPoolExecutor 来调用任务。 由于核心/队列大小配置错误,任务似乎挂在 I/O 上。 我想把挂线拉出来 以便我队列中的其他线程开始执行。
有没有办法列出线程池执行器中的线程并拉出挂起的线程?
【问题讨论】:
标签: java threadpool threadpoolexecutor
我已经实现了 ThreadPoolExecutor 来调用任务。 由于核心/队列大小配置错误,任务似乎挂在 I/O 上。 我想把挂线拉出来 以便我队列中的其他线程开始执行。
有没有办法列出线程池执行器中的线程并拉出挂起的线程?
【问题讨论】:
标签: java threadpool threadpoolexecutor
您可以控制使用的执行器,您可以使用 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
}
【讨论】: