Java-根据请求关闭并发线程
我试图建立一个程序,试图解密一个文件,已加密使用AES加密学校项目。我有一个大约100000个英文单词的列表,希望在程序中实现多线程,以优化尝试解密文件中每个单词所花费的时间 在解密成功完成的情况下,我试图停止正在搜索的词典的其余部分时遇到了一个问题-“正在尝试关闭”正在打印到控制台,但在执行器停止分配新线程之前,线程似乎继续处理词典的其余部分 在我的主程序中,线程使用以下方法运行:Java-根据请求关闭并发线程,java,multithreading,threadpoolexecutor,Java,Multithreading,Threadpoolexecutor,我试图建立一个程序,试图解密一个文件,已加密使用AES加密学校项目。我有一个大约100000个英文单词的列表,希望在程序中实现多线程,以优化尝试解密文件中每个单词所花费的时间 在解密成功完成的情况下,我试图停止正在搜索的词典的其余部分时遇到了一个问题-“正在尝试关闭”正在打印到控制台,但在执行器停止分配新线程之前,线程似乎继续处理词典的其余部分 在我的主程序中,线程使用以下方法运行: private void startThreads(){ ThreadPoolExecutor exec
private void startThreads(){
ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
System.out.println("Maximum threads inside pool " + executor.getMaximumPoolSize());
for (int i = 0; i < dict.size(); i++) {
String word = dict.get(i);
Grafter grafter = new Grafter("Grafter " + i,word);
grafter.registerWorkerListener(thread -> {
List results = thread.getResults();
for (Iterator iter = results.iterator(); iter.hasNext();) {
found = (boolean) iter.next();
if(found){
System.out.println("THE WORD HAS BEEN FOUND!! Attempting shutdown");
executor.shutdown();
}
}
});
// Start the worker thread
Thread thread = new Thread(grafter);
thread.start();
}
if(!executor.isShutdown()) {
executor.shutdown();
}
}
正确的单词就在字典的顶部,因此在程序执行的早期就可以发现成功。但是,在程序完成之前,会有一个很长的暂停(因为字典的其余部分都已完成)
我正在寻找有关executor.shutdown()定位的帮助,以及如何在解密成功完成后停止对字典的其余部分进行解析。您的主要问题是,您实际上没有向executor提交可运行文件。因此,在执行器上调用shutdown对生成的所有线程都没有影响 不要创建新线程,而是执行以下操作:
executor.submit(grafter)
这应该能帮你解决大部分问题,但是如果你想让服务迅速、干净地关闭,你还可以做更多的事情。shmosel在评论中提供的链接应该可以帮助您做到这一点
顺便说一句,我认为你这样做不会很有效率。基本上,你正在为字典中的每个单词创建一个新任务,这意味着你有大量的任务(在你的例子中是100K)。这意味着管理和调度所有这些任务的开销可能是程序执行工作的重要部分。相反,您可能希望将单词列表分成若干子列表,每个子列表包含相等数量的单词,然后使您的可运行进程只包含该子列表。在发布此消息之前,我确实检查了以前的帖子,但是在使用
executor.shutdownNow()的建议后,我仍然遇到同样的问题;执行人。等待终止()代码>在该线程上阅读有关处理中断的部分。完全正确。您需要这样做,然后调用shutdownow
。谢谢。我将研究如何实现另一篇文章中提到的中断。我已经将这篇文章标记为重复,谢谢你的帮助。@shmosel看-打断不是答案。链接的问题很有用,但问题是OP首先没有使用ExecutorService
。哈,我甚至没有注意到这一点。好地方!您的最后一段并不完全正确,因为OP使用的是FixedThreadPool
——这意味着应该有正确的线程数。你是对的,向队列中发送大量任务并不理想,当然,如果他使用了一些无界线程池,情况会更糟,但事实仍然是,他们将不得不排队等待大量任务,然后线程池将不得不出列并将所有这些任务分配给执行者。我想这是否重要取决于tryToDecrypt中完成了多少工作,但如果每个单词一个任务是最有效的方式,我会非常惊讶,
executor.submit(grafter)