我在密码破解程序分配中关闭执行程序服务时遇到问题。我知道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;
}
发现了这个问题,这是一个非常愚蠢的问题......我在 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 仍在运行。