2011-11-10 36 views
0

我想中断正在文件上运行AES加密的线程。这可能需要一段时间,到目前为止我已经想出了这个。Java - 如何中断繁忙线程

这个身体是在按钮激活事件。当用户再次点击按钮时(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(); 
+0

看起来像你正在使用的实例不是启动的实例? – r0ast3d

+0

它不应该需要一个完整的重新设计。说实话,如果你的设计不能处理这样一个简单的变化,反正你需要一个新的。 **适当的课程设计不是一件小事,甚至比编码更重要。** – corsiKa

+0

好吧,也许我有点热情......它需要一个额外的变量和一个条件。和偶尔的任务。我正在寻找是否有另一种方式 – Meltea

回答

2

据我所知,在线程终止的唯一安全方法是从线程的“main”方法返回(通常在Runnable或Thread中运行run())。例如,您可以在MyCrypto.aes256File方法中使用while(<some class member boolean>) -loop,并将布尔值设置为false,以便线程脱离循环并退出,返回指示进程未完成的值。

4

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

Thread.currentThread()。isInterrupted()

布尔,并随即采取行动。

在您的应用程序,你应该确认

结果= MyCrypto.aes256File(enInPath, enOutPath, charsToString(passT.getPassword()), 秒);

以这种方式行事(如果它的第三方库,它应该是javadoc'ed)。如果它不可中断,那么你会选择另一个加密实现。

1

另一种可能的方法是(我不太了解AES算法),将从加密中分离文件读数。读线程会从文件中填充大缓冲区并将它们排列到加密线程。加密线程将处理缓冲区并将'已使用'的队列排回读者线程。这允许通过将I/O等待到加密器外部,两个线程都可以轻松停止,同时也可能提高性能,尤其是在多核机器上。加密线程可能永远不必等待磁盘读取 - 如果加密线程有足够的缓冲区存放在队列中,则读取器线程暂时等待磁盘头移动并不重要(即使在单核机)。固定数量的缓冲区和两个(阻塞的,线程安全的)队列在阅读器线程领先于加密器之前提供流量控制。

实际的停止机制然后变得有点微不足道。在避免磁盘延迟方面的收益会压倒偶尔检查一面旗子浪费的时间,例如。就在进入下一个缓冲区的队列之前。

排队缓冲区也允许向缓冲​​区添加序列号,从而允许所有核心在加密上工作。