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