Java Executor服务关闭现在不中断

Java Executor服务关闭现在不中断,java,multithreading,executorservice,shutdown,Java,Multithreading,Executorservice,Shutdown,我在关闭密码破解任务中的executor服务时遇到问题。 我知道shutdownNoW()没有任何保证,只会尽力向所有线程发送中断。我已经试着到处放置Thread.currentThread.isInterrupted(),但是仍然缺少一些东西。我已经检查过了,它停止检查新的可能性,CPU性能也突然下降,但应用程序仍然继续运行。 我错过了什么 public void decrypt() { setStartTime(); generateTasks(); for (Cal

我在关闭密码破解任务中的executor服务时遇到问题。 我知道
shutdownNoW()
没有任何保证,只会尽力向所有线程发送中断。我已经试着到处放置
Thread.currentThread.isInterrupted()
,但是仍然缺少一些东西。我已经检查过了,它停止检查新的可能性,CPU性能也突然下降,但应用程序仍然继续运行。 我错过了什么

public void decrypt() {
    setStartTime();
    generateTasks();
    for (Callable<String> task : tasks) {
        Future<String> future = executor.submit(task);
        futureList.add(future);
    }
    for (Future<String> future : futureList) {
        try {
            if (future.get() != null) {
                executor.shutdownNow();
                decryptedPassword = future.get();
                runTime = System.currentTimeMillis() - startTime;
                printResult();
            }
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }
}

public void generateTasks() {
    for (int i = 0; i < maxPasswordLength; i++) {
        for (char ch = 'a'; ch <= 'z'; ch++) {
            tasks.add(new GuessGroup(ch, i, possibleChars, encryptedPassword));
        }
    }
}
public void decrypt(){
设置开始时间();
generateTasks();
for(可调用任务:任务){
未来=执行者提交(任务);
添加(未来);
}
for(未来:未来列表){
试一试{
if(future.get()!=null){
执行者。关机现在();
decryptedPassword=future.get();
运行时=System.currentTimeMillis()-startTime;
printResult();
}
}捕获(中断异常|执行异常e){
e、 printStackTrace();
}
}
}
公共void generateTasks(){
对于(int i=0;i因为(char ch='a';ch发现了这个问题,这是一个非常愚蠢的问题。。。
我在for循环中添加了一个
break
,该循环在
shutdownow
请求之后遍历Future列表,并修复了它

for (Future<String> future : futureList) {
    try {
        if (future.get() != null) {
            executor.shutdownNow();
            decryptedPassword = future.get();
            runTime = System.currentTimeMillis() - startTime;
            printResult();
            break;              // this was missing...
        }
    } catch (InterruptedException | ExecutionException e) {
        e.printStackTrace();
    }
}
for(未来:未来列表){
试一试{
if(future.get()!=null){
执行者。关机现在();
decryptedPassword=future.get();
运行时=System.currentTimeMillis()-startTime;
printResult();
break;//这个不见了。。。
}
}捕获(中断异常|执行异常e){
e、 printStackTrace();
}
}

所有线程都已关闭,只有main线程仍在运行。

进行线程转储,查看哪些线程仍在运行或等待。
for (Future<String> future : futureList) {
    try {
        if (future.get() != null) {
            executor.shutdownNow();
            decryptedPassword = future.get();
            runTime = System.currentTimeMillis() - startTime;
            printResult();
            break;              // this was missing...
        }
    } catch (InterruptedException | ExecutionException e) {
        e.printStackTrace();
    }
}