我有一个可以在Thread中执行的特定进程。我需要在一定时间后完全停止处理例如:90秒。
我读过我们在futuretask中有一个选项来设置线程的超时。但是我收到超时异常,但启动的任务在后端运行,使用futureTask.cancel(true)
或executor.isShutdown()
时没有完全停止。
我试图将其拆分并测试如何完全停止线程,但即使我无法完全停止启动的线程,在示例代码段下面。使用下面的代码,我们取消线程后,callable没有返回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";
}
}
答案 0 :(得分:0)
完全停止线程的唯一方法是终止进程。如果你想优雅地停止任务并保持程序运行你的任务需要支持这个。
public String call() {
for (int i = 0; i < 10000 && !Thread.currentThread().isInterrupted(); i++) {
System.out.println(i);
}
return "Task Done";
}