gpt4 book ai didi

Java - 根据请求关闭并发线程

转载 作者:行者123 更新时间:2023-12-01 08:53:49 27 4
gpt4 key购买 nike

我正在尝试构建一个程序,尝试解密已为学校项目使用 AES 加密进行加密的文件。我有一个大约 100,000 个英语单词的列表,并且希望在程序中实现多线程,以优化尝试解密文件中每​​个单词所需的时间。

在解密成功完成的情况下尝试停止搜索字典的其余部分时遇到问题 - 正在将“尝试关闭”打印到控制台,但线程似乎继续完成其余部分的工作在执行器停止分配新线程之前字典的内容。

在我的主程序中,线程使用以下方法运行:

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();
}
}

“grafter”可运行类的实现如下:

public class Grafter implements Runnable{

private String NAME;
private final String WORD;
private List listeners = new ArrayList();
private List results;

public Grafter(String name, String word){
NAME = name;
WORD = word;
}

public String getName(){
return NAME;
}

@Override
public void run() {
if (tryToDecrypt(WORD) == true){
System.out.println("Thread: '" + NAME + "' successfully decrypted using word: \"" + WORD + "\".");
results = new ArrayList();
results.add(true);

// Work done, notify listeners
notifyListeners();
}else{
results = new ArrayList();
results.add(false);

// Work done, notify listeners
notifyListeners();
}
}

private void notifyListeners() {
for (Iterator iter = listeners.iterator(); iter.hasNext();) {
GrafterListener listener = (GrafterListener) iter.next();
listener.workDone(this);
}
}

public void registerWorkerListener(GrafterListener listener) {
listeners.add(listener);
}

public List getResults() {
return results;
}

private boolean tryToDecrypt(String word){
//Decryption performed, returning true if successfully decrypted,
//Returns false if not
}

}

正确的单词位于字典的顶部,因此在程序执行的早期就可以发现成功。然而,在程序完成之前有一个很长的暂停(因为字典的其余部分已经完成)。

我正在寻求有关 executor.shutdown() 定位的帮助,以及如何在解密成功完成后停止解析字典的其余部分。

最佳答案

您的主要问题是您实际上并未将可运行文件提交给执行器。因此,在执行器上调用 shutdown 对您生成的所有线程没有影响。

不要创建新线程,而是执行以下操作:

executor.submit(grafter)

这应该可以帮助您完成大部分工作,但如果您希望该服务迅速且干净地关闭,您还可以做更多的事情。 shmosel 评论中提供的链接应该可以帮助您。

顺便说一句,我认为你这样做的方式不会非常有效。本质上,您正在为字典中的每个单词创建一个新任务,这意味着您有大量任务(在您的情况下为 100K)。这意味着管理和调度所有这些任务的开销可能是程序执行的工作的很大一部分。相反,您可能希望将单词列表分解为一定数量的子列表,每个子列表包含相同数量的单词,然后使您的可运行进程仅包含子列表。

关于Java - 根据请求关闭并发线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42186151/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com