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

标签 java multithreading timeout callable futuretask

我有一个可以在线程中执行的特定进程。我需要在一定时间后完全停止处理,例如: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/

相关文章:

java - 如何在保持宽高比的同时填充应用程序小部件中的 ImageView?

java - 如何将自定义菜单栏项放置在 map 菜单中的所需位置

multithreading - 使用 3 个条件变量同步 3 个线程

python - 线程上的启动方法因 TypeError 而失败

c++ - pthread 在完成后泄漏内存

python - 具有超时、最大大小和连接池的 http 请求

java - 具有 Hibernate 二级缓存的 Jhipster Multi-Tenancy

java - 如何获取从 Eclipse IDE 中的类调用的方法列表?

Android:调用Web服务时操作超时

asp.net-mvc - MVC3中的错误-请求永不超时。适用于同一项目中的aspx页面