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