gpt4 book ai didi

Java ExecutorService 暂停/恢复特定线程

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:55:51 26 4
gpt4 key购买 nike

有没有办法使用 ExecutorService 暂停/恢复特定线程?

private static ExecutorService threadpool = Executors.newFixedThreadPool(5);

假设我想停止 id=0 的线程(假设每个线程都被分配了一个递增的 id,直到达到线程池的大小)。

一段时间后,比方说,通过按下一个按钮,我想恢复该特定线程并让所有其他线程保持其当前状态,可以暂停或恢复。

我在 Java 文档中发现了一个未完成版本的 PausableThreadPoolExecutor。但它不适合我的需要,因为它会恢复池中的所有线程。

如果无法使用 ExecutorService 的默认实现来解决这个问题,谁能为我指出一个 Java 实现来解决这个问题?

最佳答案

你走错路了。线程池拥有线程,与您的代码共享它们可能会把事情搞砸。
您应该专注于使您的任务(传递给可取消/可中断的线程),而不是直接与池拥有的线程交互。
此外,在您尝试中断线程时您不会知道正在执行什么作业,所以我不明白您为什么会对这样做感兴趣

更新:
取消在线程池中提交的任务的正确方法是通过执行器返回的任务的 Future
1)这样你就可以确定你实际瞄准的任务正在尝试取消
2)如果您的任务已经设计为可取消,那么您已经成功了一半
3) 不要使用标志来指示取消,而是使用 Thread.currentThread().interrupt()

更新:

public class InterruptableTasks {  

private static class InterruptableTask implements Runnable{
Object o = new Object();
private volatile boolean suspended = false;

public void suspend(){
suspended = true;
}

public void resume(){
suspended = false;
synchronized (o) {
o.notifyAll();
}
}


@Override
public void run() {

while(!Thread.currentThread().isInterrupted()){
if(!suspended){
//Do work here
}
else{
//Has been suspended
try {
while(suspended){
synchronized(o){
o.wait();
}
}
}
catch (InterruptedException e) {
}
}
}
System.out.println("Cancelled");
}

}

/**
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
ExecutorService threadPool = Executors.newCachedThreadPool();
InterruptableTask task = new InterruptableTask();
Map<Integer, InterruptableTask> tasks = new HashMap<Integer, InterruptableTask>();
tasks.put(1, task);
//add the tasks and their ids

Future<?> f = threadPool.submit(task);
TimeUnit.SECONDS.sleep(2);
InterruptableTask theTask = tasks.get(1);//get task by id
theTask.suspend();
TimeUnit.SECONDS.sleep(2);
theTask.resume();
TimeUnit.SECONDS.sleep(4);
threadPool.shutdownNow();
}

关于Java ExecutorService 暂停/恢复特定线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11915968/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com