Java-如何中断繁忙的线程

Java-如何中断繁忙的线程,java,multithreading,aes,Java,Multithreading,Aes,我试图中断正在文件上运行AES加密的线程。这可能需要一段时间,到目前为止我已经想出了这个 此主体位于按钮激活事件中。当用户再次单击按钮时(else子句)。线程应该被中断,但如果我能完全停止线程,我会更高兴。但这是不赞成的 无论如何,线程忽略.interrupt()并继续执行aes256File。它确实提升了fileEncryptThread.isInterrupted()标志,但从cpu使用情况来看,它仍然在继续处理文件 我已经阅读了关于线程安全停止的指南,但是我不想完全重新设计我已经很慢的AE

我试图中断正在文件上运行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();

好的,线程终止的唯一安全方法是从线程的“main”方法返回(通常是Runnable或thread中的run()。例如,您可以在MyCrypto.aes256File-方法中使用
while()
-循环,并将布尔值设置为false,以便线程脱离循环并退出,返回一个值,指示进程未完成。

为了有效地中断线程,必须以可中断的方式写入该线程。也就是说,检查

Thread.currentThread().isInterrupted()

并据此采取行动

在你的应用程序中,你应该验证

结果=MyCrypto.aes256文件(路径, enOutPath, charsToString(passT.getPassword()), 证券交易委员会)


以这种方式操作(如果它是第三方库,则应该是javadoc'ed)。如果不可中断,您可以选择另一种加密实现。

另一种可能的方法(我对AES算法不太了解)是将文件从加密读取中分离。读取线程将填充文件中的大型ish缓冲区,并将它们排入加密线程队列。加密线程将处理缓冲区,并将“已使用”的缓冲区排回到读线程。通过将I/O等待移出加密机,这样既可以轻松停止两个线程,又可以提高性能,特别是在多核机器上。加密线程可能永远不必等待磁盘读取-如果加密线程在队列中有足够的缓冲区,读卡器线程临时等待磁盘头移动将无关紧要(即使在单核机器上)。固定数量的缓冲区和两个(阻塞、线程安全)队列在读卡器线程领先于加密器时提供流量控制

然后,实际的停止机制变得有些琐碎。避免磁盘延迟的好处将压倒偶尔检查标志所浪费的时间,例如在进入下一个缓冲区队列之前


排队缓冲区还允许向缓冲区添加序列号,从而允许所有核心进行加密。

看起来您正在使用的实例与启动的实例不同?不需要完全重新设计。老实说,如果你的设计不能处理像这样的简单更改,你还是需要一个新的。正确的类设计不是一件小事,甚至应该比编码更重要。。。它需要一个额外的变量和一个条件。还有偶尔的任务。我在看是否还有其他方法如果其他一切都失败了,总是电源开关:-)是的,我在想,重新启动应用程序。但那将是一个糟糕的设计。最后,我让我的AES256文件可以从外部中断。。。