Java ExecutorService shutdownNow不会中断

时间:2018-04-07 14:21:40

标签: java multithreading executorservice shutdown

我在密码破解程序分配中关闭执行程序服务时遇到问题。 我知道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));
        }
    }
}

我的GuessGroup类实现了Callable:

@Override
public String call() throws Exception {
    for (int i = 0; i < passwordLength; i++) {
        String result = recursiveCrack("", i);
        if (result != null) {
            return result;
        }
        else if (Thread.currentThread().isInterrupted()) {
            return null;
        }
    }
    return null;
}

public String recursiveCrack(String stem, int length) {
    if (Thread.currentThread().isInterrupted()) {
        return null;
    }
    if (length == 0) {
        if (hashCalc.hash(prefix + stem).equals(encryptedPassword)) {
            String result = prefix + stem;
            return result;
        }
    }
    else {
        for (char ch : possibleChars) {
            String result = recursiveCrack(stem + ch, length - 1);
            if (result != null) {
                return result;
            }
        }
    }
    return null;
}

1 个答案:

答案 0 :(得分:0)

发现问题,这是一个非常愚蠢的... 我在for循环中添加了一个break,它在shutdownNow请求之后迭代了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();
    }
}

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