如何在1.8中使用可调用的futuretask完全终止执行任务

时间:2017-03-27 08:35:35

标签: java multithreading timeout callable futuretask

我有一个可以在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";
    }
} 

1 个答案:

答案 0 :(得分:0)

完全停止线程的唯一方法是终止进程。如果你想优雅地停止任务并保持程序运行你的任务需要支持这个。

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