Java 如何在1.8中使用callable futuretask完全终止正在执行的任务

Java 如何在1.8中使用callable futuretask完全终止正在执行的任务,java,multithreading,timeout,callable,futuretask,Java,Multithreading,Timeout,Callable,Futuretask,我有一个可以在线程中执行的进程。我需要在特定时间后完全停止处理例如:90秒。 我读到我们在futuretask中有一个选项来设置线程的超时。但我收到超时异常,但启动的任务正在后端运行,使用futureTask.cancel(true)或executor.isshutton()时未完全停止 我试图将其拆分并测试如何完全停止线程,但即使是在示例代码下面,我也无法完全停止已启动的线程。使用下面的代码,在我们取消线程后,可调用函数没有返回字符串,但是我可以看到for在取消线程时没有停止 请帮我找不到的地

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

我试图将其拆分并测试如何完全停止线程,但即使是在示例代码下面,我也无法完全停止已启动的线程。使用下面的代码,在我们取消线程后,可调用函数没有返回字符串,但是我可以看到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";
    }
} 
import java.util.concurrent.Callable;
导入java.util.concurrent.ExecutionException;
导入java.util.concurrent.ExecutorService;
导入java.util.concurrent.Executors;
导入java.util.concurrent.FutureTask;
公共类未来任务演示{
公共静态void main(字符串…参数)抛出InterruptedException、ExecutionException{
ExecutorService exService=Executors.newSingleThreadExecutor();
FutureTask FutureTask=新的FutureTask(新任务());
exService.execute(未来任务);
//检查任务是否完成
System.out.println(“任务完成:+futureTask.isDone());
//检查任务是否已取消
System.out.println(“任务被取消:+futureTask.isCancelled());
布尔值isCancel=futureTask.cancel(true);
System.out.println(“取消:+isCancel”);
//获取结果并在未准备好时等待
System.out.println(“任务完成:+futureTask.get());
}
}
类任务实现可调用{
公共字符串调用(){

对于(int i=0;i而言,完全停止线程的唯一方法是终止进程。如果要优雅地停止任务并保持程序运行,您的任务需要支持这一点

public String call() {
    for (int i = 0; i < 10000 && !Thread.currentThread().isInterrupted(); i++) {
         System.out.println(i);
    }
    return "Task Done";
}
公共字符串调用(){
对于(int i=0;i<10000&&!Thread.currentThread().isInterrupted();i++){
系统输出打印LN(i);
}
返回“任务完成”;
}

感谢Peter Lawrey的评论,但我的实际用例是停止方法的处理,这里我刚刚提到了示例代码…@Selva。答案也一样。您调用的代码支持中断或提前终止,或者您必须终止进程。正如我所要求的,我的用例是停止child从父线程执行线程处理。在我的子线程中,我调用了一个执行大量处理的方法,这里我无法检查
!thread.currentThread().isInterrupted()
在方法内部的所有业务逻辑中。请告诉我我们还有其他可行的方法吗suggestion@Selva您可以使用字节码注入来添加这些检查或更改它定期调用的库来执行检查。我也有同样的问题。您是如何解决的?谢谢!@TikTik