[英]Java - how to interrupt a busy thread
我试图中断正在文件上运行AES加密的线程。 这可能需要一段时间,到目前为止,我已经提出了这个建议。
该主体位于按钮激活事件内部。 当用户再次单击按钮时(else子句)。 线程应该被打断,但是如果我可以完全停止线程的话,我会更快乐。 但这已被弃用。
无论如何,线程将忽略.interrupt()并继续执行aes256File。 它的确提高了fileEncryptThread.isInterrupted()标志,但是从CPU的使用情况来看,它仍然继续处理文件。
我已经阅读了有关安全停止线程的指南,但是我不想完全重新设计我已经很慢的AES实现以检查类外中断标志...
fileEncryptThread = new FileThread() // new thread please
{
@Override
public void run()
{
String result = "";
result = MyCrypto.aes256File(enInPath,
enOutPath,
charsToString(passT.getPassword()),
sec);
if (!"".equals(result)) // error handling
{
JOptionPane.showMessageDialog(null,result);
}
}
};
fileEncryptThread.start();
}
else // if stop clicked
{
fileEncryptThread.interrupt();
为了有效地中断线程,必须以一种可中断的方式写入该线程。 也就是说,检查
Thread.currentThread()。isInterrupted()
布尔值,然后采取行动。
在您的应用中,您应验证
结果= MyCrypto.aes256File(enInPath,enOutPath,charsToString(passT.getPassword()),秒);
以这种方式操作(如果它是第三方库,则应使用javadoc'ed)。 如果它不是不可中断的,则可以选择另一种实现方式进行加密。
AFAIK,线程终止的唯一安全方法是从线程的“主”方法(通常是Runnable或Thread中的run())返回。 例如,您可以在MyCrypto.aes256File -method中使用while(<some class member boolean>)
-loop并将boolean设置为false,这样线程将退出循环并退出并返回一个值,该值指示进程未完成。
另一种可能的方法(我不太了解AES算法)将从加密中读取文件分开。 读取线程将填充文件中较大的缓冲区,并将它们排队到加密线程中。 加密线程将处理缓冲区,并将“已使用”的缓冲区排队返回给读取器线程。 通过将I / O等待移出加密器,这既可以轻松停止两个线程,又可以提高性能,尤其是在多核计算机上。 加密线程可能永远不必等待磁盘读取-如果加密线程在队列中有足够的缓冲区(即使在单核上),则读取器线程临时等待磁盘磁头移动也无关紧要。机)。 固定数量的缓冲区和两个(阻塞,线程安全)队列可在读取器线程领先加密器之前提供流控制。
这样,实际的停止机制就变得微不足道了。 避免磁盘等待时间的收益将使偶尔检查标志所浪费的时间不堪重负。 就在进入下一个缓冲区的队列之前。
然后,对缓冲区进行排队还可以将序列号添加到缓冲区中,从而允许所有内核进行加密。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.