Java 如何终止ExecutorService调用的可调用进程

Java 如何终止ExecutorService调用的可调用进程,java,multithreading,executorservice,Java,Multithreading,Executorservice,在下面的代码中,我想终止ExecutorService提交的可调用进程。当前,即使在循环执行之前调用了关闭,可调用进程的执行也不会终止 任何建议都会有帮助 package foundation.util.sql.parser; import java.io.IOException; import java.util.HashMap; import java.util.concurrent.*; public class Test { public static void main(S

在下面的代码中,我想终止ExecutorService提交的可调用进程。当前,即使在循环执行之前调用了关闭,可调用进程的执行也不会终止

任何建议都会有帮助

package foundation.util.sql.parser;

import java.io.IOException;
import java.util.HashMap;
import java.util.concurrent.*;

public class Test {

   public static void main(String[] args) {
        try {

            final java.util.Map<String, ExecutorService> map = new HashMap<>();
            ExecutorService service = Executors.newFixedThreadPool(1);
            map.put("1", service);
Thread thread = new Thread(new Runnable() {

                @Override
                public void run() {
                    try {

                        System.out.println("Termination Initiated");
                        ExecutorService executorService = map.get("1");
                        System.out.println("ShutDown called");

                        if(!executorService.isShutdown())
                        {
                            executorService.shutdownNow();
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
            Future<Boolean> submit = service.submit(new Callable<Boolean>() {

                @Override
                public Boolean call() throws Exception {
                    int j = 0;
                    System.out.println(Thread.currentThread().getName());
                    for (int i=0; i<5000;i++) {
                        //Some business Process.
                        j = i;
                    }
                    System.out.println("Test____"+ j);
                    return null;
                }
            });
           thread.start();
           submit.get();
        } catch (Exception e) {
           e.printStackTrace();
        }
    }

}
<代码>包基础.UTI.S.L.解析器; 导入java.io.IOException; 导入java.util.HashMap; 导入java.util.concurrent.*; 公开课考试{ 公共静态void main(字符串[]args){ 试一试{ final java.util.Map Map=new HashMap(); ExecutorService=Executors.newFixedThreadPool(1); 地图放置(“1”,服务); Thread Thread=新线程(new Runnable(){ @凌驾 公开募捐{ 试一试{ 系统输出打印项次(“终止启动”); ExecutorService ExecutorService=map.get(“1”); System.out.println(“调用关机”); 如果(!executorService.isShutdown()) { executorService.shutdownNow(); } }捕获(例外e){ e、 printStackTrace(); } } }); Future submit=service.submit(new Callable()){ @凌驾 公共布尔调用()引发异常{ int j=0; System.out.println(Thread.currentThread().getName());
对于(int i=0;i当我们调用
showdonnow()
时,实际上它不会终止正在运行的任务

它只是防止等待任务启动尝试停止当前执行的任务

依照

除了尽最大努力停止处理正在执行的任务之外,没有任何保证。例如,典型的实现将通过Thread.interrupt()取消,,因此任何无法响应中断的任务可能永远不会终止

在callable中,您没有响应/检查中断。您需要定期检查是否设置为true。如果设置为true,请根据需要进行必要的清理并终止

例如,在您的情况下,您可以考虑检查<代码>中断标志< /代码>如下(或适用的地方):


for(int i=0;它支持有价值的响应。
for (int i=0; i<5000;i++) {
    //Some business Process.
    if(Thread.currentThread().isInterrupted()) {
     // do any cleanup and return from here.
     return false;
    }
    j = i;
}