Java Thread.stop()vs Thread.interrupt()

时间:2013-12-11 19:09:17

标签: java multithreading

我有以下代码:

renderThread = new Thread(new Runnable() {

    @Override
    public void run() {
        for (int i = 0; i < 10000000; i++) {
            System.out.println("Number: " + i);
        }
    }
});

renderThread.start();

try {
    Thread.sleep(100);
} catch (InterruptedException ex) {
    ex.printStackTrace();
}

renderThread.interrupt(); //It should stop, but it does not stop.

renderThread.interrupt()不会中断线程,它会继续运行。如果我用renderThread.interrupt()替换.stop(),则线程会停止。但是,不推荐使用.stop()。 那么,如果stop被弃用且interrupt不起作用,停止某个主题的正确方法是什么?

6 个答案:

答案 0 :(得分:20)

当你调用interrupt()时,它会触发一个布尔标志,告诉它应该停止的运行函数。这就是我经常写这样的运行函数的原因。

void run()
{
    while(!Thread.interrupted())
    {
        //Do something
    }
}

仅仅因为你打电话给中断并不意味着线程会立即停止或完全停止。这取决于运行函数中的内容。

答案 1 :(得分:6)

要真正说明为什么不应该使用Thread.stop()

Doug Lea最近提到Thread.stop将是 首先实现Java的方法 来Java 8。

他对某人发表评论的回应:

  

此外,另一个同步的事情是它处理它   异步中止线程(即线程.stop())。我知道stop()是   已弃用,但你永远都不知道。

是:

  

但你知道!从JDK8开始,Thread.stop真的不见了。它是   第一个已弃用的方法实际上已被取消实施。现在呢   只抛出UnsupportedOperationException。

http://cs.oswego.edu/pipermail/concurrency-interest/2013-December/012028.html

答案 2 :(得分:5)

你应该看看这篇文章: http://10kloc.wordpress.com/2013/03/03/java-multithreading-steeplechase-stopping-threads/

基本上你不应该停止一个线程(不安全),但要中断它。 你缺少的是让线程处理中断。

答案 3 :(得分:3)

所有你需要做的是中断当前线程或终止线程的运行过程 在catch块中添加以下语句

try
{
   Thread.sleep(4000);
   System.out.println("VAS CONSULTING")
}
catch(InterruptedException e)
{
   //Stop printing out VAS CONSULTING
   return;  /*This will terminate the thread*/
}

如果在run方法中没有使用不会引发中断异常的方法 你可以这样做来处理线程中断或终止线程

@Override
public void run()
{

   System.out.println("VAS CONSULTING");
   if(Thread.Interrupted())
   {
     doSomethingElse();//process something else within the thread
    return; //Terminates the current Thread
   }

}

我希望这可以帮助你或其他人。

答案 4 :(得分:2)

  

renderThread.interrupt()不会中断线程,它会继续   跑。

  • 如果线程正在执行并且调用interrupt(),则设置中断状态。
  • 如果在调用Object类的wait方法之一或此类的Thread.joinThread.sleep方法中阻止此线程,则其中断状态将为被清除,它将收到InterruptedException

例如:

Thread t = new Thread()
      {
          public void run()
          {
              try {
                  for(int i=0; i<10000;i++)
                      System.out.println("Is interrupTed? "+this.isInterrupted());

                  Thread.sleep(200);
              } catch (InterruptedException ex) {
                  Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex);
              }

          }
      };
      t.start();
      t.interrupt();
    }

上面的代码,我使用for循环来拦截带有isInterrupted()函数的interrput标志并打印出来。调用t.interrupt()后,isInterrupted()将返回您将在控制台中看到的true。一旦到达Thread.sleep(miliTime),您将看到InterruptedException被抓住,如上所述被抛出。

停止线程:

您可以使用此isInterrupted()标记检查是否在其上调用了interrupt()并从执行中返回:

例如:

Thread t = new Thread()
      {
          public void run()
          {
              long executeTime = System.currentTimeMillis() ;
              int i = 0;    
              for(; i<10000 && !this.isInterrupted();i++)
                      System.out.println("Is interrupted? "+this.isInterrupted());

               System.out.println("Was Interrupted? "+this.isInterrupted()
                                  +" after cycle: "+ i);
               System.out.println("Time it gets Executed: "
                                  +(System.currentTimeMillis() - executeTime+" ms"));

          }
      };
      t.start();
        try {
            Thread.sleep(200);
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
      t.interrupt();

运行上面的代码时:我已经将主线程发送到静态main函数内的200睡眠状态,以允许启动的线程t运行一段时间。然后我调用了
t.interrupt()导致for循环停止并打印输出如下:

Was Interrupted? true after cycle: 1477
Time it gets Executed: 258 ms

这表示for循环在1148函数中调用t.interrupt();之前进行了main次迭代。

请阅读Thread.interrupt()功能的文档以获取更多详细信息。

答案 5 :(得分:0)

interrupt()方法不会停止Thread。 阅读本文以获取更详细的解释http://www.ibm.com/developerworks/java/library/j-jtp05236/