如何在Java中停止正在运行的Thread

时间:2016-09-25 06:07:21

标签: java multithreading threadpoolexecutor

我正在使用基于Java的文件转换工具将PDF转换为DOCX,但有时在转换时它会卡住,如果输入文件大小超过1 MB并开始使用100%CPU和更多内存并继续运行。我想停止这个连续的线程。

  1. 我知道stop()函数已被弃用。
  2. 调用thread.interrupt();没有帮助,因为线程一直在运行。
  3. 代码中没有循环...因此无法检查循环中的中断标志
  4. 如何停止正在运行的线程t。

    public class ThreadDemo implements Runnable {
    
        Thread t;
    
        PdfToDocConversion objPdfToDocConversion;
    
        ThreadDemo() throws InterruptedException {
    
            t = new Thread(this);
            System.out.println("Executing " + t.getName());
            // this will call run() fucntion
            t.start();
    
            Thread.sleep(2000);
    
            // interrupt the threads
            if (!t.interrupted()) {
                System.out.println("Interrupted");
    
                t.interrupt();
    
            }
    
            System.out.println(t.isInterrupted()); // true 
    
            System.out.println(t.getName());
    
            System.out.println(t.isAlive());   /// still true 
    
            // block until other threads finish
            try {
                t.join();
            } catch (InterruptedException e) {
            }
        }
    
        public void run() {
    
            objPdfToDocConversion = new PdfToDocConversion();
            try {
    
    
        objPdfToDocConversion.convertDocToPdf();//inside this function thread got stuck
    
            } catch (InterruptedException e) {
    
                Thread.currentThread().interrupt(); 
                System.out.print(t.getName() + " interrupted:");
                e.printStackTrace();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    
        public static void main(String args[]) {
            try {
                new ThreadDemo();
            } catch (InterruptedException e) {
                    e.printStackTrace();
            }
        }
    }
    

4 个答案:

答案 0 :(得分:3)

Thread.interrupt()仅在Thread对象中设置一个标志,该标志应该被中断。它不会导致目标Thread抛出InterruptedException,而是可以中断的代码必须不断检查该标志以查看是否有人请求它被中断。然后,该代码必须处理它,通常是抛出InterruptedException

答案 1 :(得分:3)

您可以在boolean标志的帮助下建立自己的逻辑来杀死线程。

public class RunningThread implements Thread {

   private volatile boolean running = true;

   public void run() {

     while (running) {
        try {
            // Add your code here
        } catch (InterruptedException e) {
             if(!running){
                break;
             }
        }
     }
   }

   public void stopThread() {
       running = false;
       interrupt();
   }

}

以下是用例:

RunningThread thread = new RunningThread();
thread.start(); // start the thread
thread.stopThread(); // stops the thread

上述方法最初由Google开发人员用于框架a.k.a Volley库。

答案 2 :(得分:1)

有些答案是关于使用volatile boolean isRunning停止循环,但我没有在您的示例中看到任何循环。中断线程实际上并没有“立即”中断它。它只是说“一旦有这样的机会,线程就会被打断”。在你的情况下,我建议关闭你的PDF文件,并用一些布尔值标记它 - 然后你可以捕获IOException并且如果设置了标志 - 这意味着你导致了这种情况,你可以完成线程。

答案 3 :(得分:0)

您可以创建一个布尔字段并在run:

中进行检查
public class Task implements Runnable {

   private volatile boolean isRunning = true;

   public void run() {

     while (isRunning) {
         //do work
     }
   }

   public void kill() {
       isRunning = false;
   }

}