Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在检查完所有进度标志后终止已进入资源密集型方法的java线程?_Java_Multithreading - Fatal编程技术网

如何在检查完所有进度标志后终止已进入资源密集型方法的java线程?

如何在检查完所有进度标志后终止已进入资源密集型方法的java线程?,java,multithreading,Java,Multithreading,基本问题是从外部安全地终止线程 事件调度线程(EDT)生成新的工作线程(workerThread)。此workerThread必须完成一项任务。该任务在循环的几个迭代中完成每次迭代有两部分:读取数据(IO)和计算数据(摘要)。EDT可以随时通过workerThread代码中的布尔标志(flag_CANCEL)通知workerThread取消。问题是,唯一一次检查标志是在IO和/或摘要之后。这提供了到子迭代级别的即时取消 我想要的是IO或摘要期间的取消。重复检查Thread.interrupted

基本问题是从外部安全地终止线程

事件调度线程(EDT)生成新的工作线程(workerThread)。此workerThread必须完成一项任务。该任务在循环的几个迭代中完成每次迭代有两部分:读取数据(IO)和计算数据(摘要)。EDT可以随时通过workerThread代码中的布尔标志(flag_CANCEL)通知workerThread取消。问题是,唯一一次检查标志是在IO和/或摘要之后。这提供了到子迭代级别的即时取消

我想要的是IO或摘要期间的取消。重复检查Thread.interrupted与FLAG\u CANCEL checking相同。这不起作用。由于IO和Digest不抛出任何InterruptedException(也不能修改它们来抛出任何InterruptedException),workerThread.interrupt()不起作用(循环中的任何内容都不会被中断)

  • 如何终止IO或就地消化
  • 我可以安全地使用Thread.stop()吗(与重新初始化不安全的监视器暴露对象一样安全)
  • 这是EDT调用

     private final Runnable runnable= new Runnable() {
        @Override
        public void run() {
            try {
    
                //hasher is a global instance in EDT of Hasher class
    
                hasher.hash(file);
    
            } catch (NoSuchAlgorithmException ex) {
                //do something
                
    
            } catch (IOException ex) {
                //do something
            } 
            catch (InterruptedException ex) {
                 //do something
            }
    
        }
    
    };
    Thread workerThread=new Thread(runnable);
    workerThread.setDaemon(true);
    workerThread.start();
    
    下面是类哈希器的方法

    synchronized public String hash(File file) throws NoSuchAlgorithmException, FileNotFoundException, IOException 
    {
    
        FLAG_CANCEL_HASHING = false;//global
        byte[] buffer =new buffer[calculateBufferSize()];
        MessageDigest md = MessageDigest.getInstance(algorithm);
        FileInputStream fis = new FileInputStream(file);
        int bytesRead;
        float totalBytesRead = 0;
        
        //start hashing
        while ((bytesRead = fis.read(buffer)) != -1)//IO
        {
    
            //check before Digest    
    
            if (FLAG_CANCEL_HASHING) 
            {              
                fireCancellationEvent();
                return null;               
              
            }
           
    
            md.update(buffer, 0, bytesRead);//Digest
            
          
               //check before IO
    
            iif (FLAG_CANCEL_HASHING) 
            {              
                fireCancellationEvent();
                return null;               
              
            }
            
            
            totalBytesRead += bytesRead;         
            fireProgressEvent(totalBytesRead );
            
    
        }
        
    
        
        fis.close();
    
        return  toHexString(md.digest());
        
       
    
    }
    
    我是否可以调用workerThread.stop(),然后在下次调用runnable时安全地使用hasher

    解决方案-这是否绝对足够(确保下次从EDT调用hasher时不会出错)

  • 在EDT中执行workerThread.stop的步骤&&

  • 重新初始化哈希程序,标记\u取消\u哈希&&

  • 在取消后忽略所有激发的事件

  • 明确关闭金融机构(首先使其全球化)

    (基本上在EDT中创建一个新的hasher实例)


  • 请记住,在资源密集型IO或摘要期间,所需的只是终止,以不影响对哈希器的任何后续调用的工作。例如,在通过stop终止线程后,调用rutime.getRuntime.gc是否会清理暴露的对象并防止下次调用hasher时出现任何不良行为?

    只是为了完整性:Java的InputStream.read()方法确实抛出InterruptedIOException-因此我认为interrupt()是在I/O线程上,等待将中止读取,并出现该异常…java.io.InputStream.read()的可能副本不会引发InterruptedIOException,但IOException..没有帮助(JDK1.8)[link]特定于正则表达式匹配(或其他)但是jist是一个线程,如果外部对象没有被访问,它就可以通过stop终止,这几乎从来都不是事实。例如,在这里,workerThread锁定hasher,即使我在stop杀死workerThread后重新初始化hasher,我对md.digest中暴露的内容一无所知,那又如何呢?对象曝光没有足够的约束条件来决定线程死亡,是吗?