我试图构建一个程序,试图解密使用AES加密为学校项目加密的文件。我有一个约100,000个英语单词的列表,并且希望在程序中实现多线程以优化文件中每个单词尝试解密所花费的时间。Java - 根据请求关闭并发线程
我有试图阻止字典的休息时被搜查解密成功完成事件的一个问题 - “试图关闭”被打印到控制台,但现在看来,该线程将继续通过工作执行程序停止分配新线程之前的其余字典。
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();
}
}
和“受贿”运行的类的实现如下:
在我的主要程序,线程使用此方法运行
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()的定位的帮助,以及如何在解密成功完成后停止解析字典的其余部分。
我在发布之前检查了以前的帖子,但是在使用executor.shutdownNow()的建议后,我仍然遇到同样的问题。 executor.awaitTermination();'在该线程 – user3379139
阅读有关处理中断的部分。 – shmosel
[Shmosel](https://stackoverflow.com/users/1553851/shmosel)是完全正确的。您需要[妥善处理中断(https://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html),并调用'shutdownNow'。 –