gpt4 book ai didi

java - 如何在1.8中使用可调用的futuretask完全杀死正在执行的任务

转载 作者:行者123 更新时间:2023-12-03 13:09:09 25 4
gpt4 key购买 nike

我有一个可以在线程中执行的特定进程。我需要在一定时间后完全停止处理,例如:90秒。
我读到我们在futuretask中有一个选项可以设置线程超时。但是我收到超时异常,但是启动的任务正在后端运行,在使用futureTask.cancel(true)executor.isShutdown()时并没有完全停止。

我试图将其拆分并测试如何完全停止线程,但是即使在示例代码下面,我也无法完全停止启动的线程。使用以下代码,可取消调用在取消线程后不会返回String,但是我可以看到for不会在取消线程时停止。

请帮助我错过的地方吗?

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
public class FutureTaskDemo {
public static void main(String... args) throws InterruptedException, ExecutionException{
ExecutorService exService = Executors.newSingleThreadExecutor();
FutureTask<String> futureTask= new FutureTask<String>(new Task());
exService.execute(futureTask);
//checks if task done
System.out.println("Task Done :"+futureTask.isDone());
//checks if task canceled
System.out.println("Task isCancelled :"+futureTask.isCancelled());
boolean isCancel = futureTask.cancel(true);
System.out.println("Cancelled :"+isCancel);
//fetches result and waits if not ready
System.out.println("Task is done : "+futureTask.get());
}
}
class Task implements Callable<String>{
public String call() {
for (int i=0; i<10000; i++){
System.out.println(i);
}
return "Task Done";
}
}

最佳答案

完全停止线程的唯一方法是终止进程。如果要正常停止任务并保持程序运行,则Task需要支持此操作。

public String call() {
for (int i = 0; i < 10000 && !Thread.currentThread().isInterrupted(); i++) {
System.out.println(i);
}
return "Task Done";
}

关于java - 如何在1.8中使用可调用的futuretask完全杀死正在执行的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43041532/

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