如何停止后台线程,`interupt`不工作

时间:2015-06-25 06:47:17

标签: android multithreading

考虑这个例子:

Thread thread = new Thread(new Runnable() {
    public void run() {
      // Sleep for 5000ms
      // Show toast message
    }
  });

现在我将在MainActivity中单击按钮时启动此线程,然后我会在按下后退按钮时退出活动,但是在下面的代码中实现onBackPressed的覆盖方法:

If(thread != null)
   thread.interupt();
finish();

几秒钟后会显示吐司信息,为什么会这样?

2 个答案:

答案 0 :(得分:1)

中断,清除线程的interrupt状态,并导致InterruptedException被抛出。因此,如果您的线程处于休眠状态,并且在它处于睡眠状态时,您将调用interrupt,它将被唤醒,执行流程将从catch块后面的指令继续。假设你有一些非常简单的东西:

public void run() {
   try {
      Thread.sleep(500);
   } catch (InterruptedException e) {
      e.printStackThreace();
   }
   runOnUiThread(TOAST);
}

public void run() {
   while(true) {
      try {
         Thread.sleep(500);
      } catch (InterruptedException e) {
         e.printStackThreace();
      }
      runOnUiThread(TOAST);
   }
}
即使你调用了interrupt()

也会显示Toast

答案 1 :(得分:0)

虽然blackbelt已经解释了发生这种情况的原因,但以下是解决问题的方法。

中断线程的最佳方法是使用if-boolean-break方法。 因此,如果我要重新编写代码,那将是以下几行

onBackPressed:

isBackPressed = true;

在线程的run方法中:

    Thread thread = new Thread(new Runnable() {
       public void run() {
         // Sleep for 5000ms
         if(!isBackPressed){
          // Show toast message
         }
       }
    });