【发布时间】:2018-09-17 09:36:33
【问题描述】:
我在密码破解分配中遇到了关闭执行程序服务的问题。
我知道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;
}
【问题讨论】:
-
进行线程转储并查看哪些线程仍在运行或等待。
标签: java multithreading executorservice shutdown