java - 终止线程似乎不起作用

标签 java android multithreading terminate

我的服务类中有以下线程。

public class MyLocalThread extends Thread {
  @Override
  public void run() {
    while (!Thread.interrupted()) {
      try {
        //do some work
         Thread.sleep(4000);
      } catch (Exception e){
          System.out.println("Exception occur" + e.getMessage());
          e.printStackTrace();
      }
    }
  }
}

当我收到来自 MainActivity.java 的 Intent 操作时,我正在尝试启动和停止线程。我已经建立了 BroadcastReceiver 来在服务和 Activity 之间进行通信。我像下面这样启动线程。线程开始正常,我收到 toast 。

public class MyReceiver extends BroadcastReceiver {

    MyLocalThread thread = new MyLocalThread();

  @Override
  public void onReceive(Context context, Intent intent) {

    String action = intent.getAction();

    if (action.equals("com.example.START")) {

      //starts the thread

      thread.start();

      Toast.makeText(context, "Service is started.", Toast.LENGTH_LONG).show();

    } else if (action.equals("com.example.STOP")) {

      //stops the thread
    thread.interrupt();
      Toast.makeText(context, "Service has stopped.", Toast.LENGTH_LONG).show();

    }
  }
}

但是当尝试停止我的线程时,即 second action 不起作用。我收到一个 TOAST,表示服务已停止,但我的线程仍在继续运行。它不会终止。我不知道我做错了什么?

最佳答案

编辑:

您可以调用 thread.interrupt() 来中断线程并放置 Thread.interrupted() 检查而不是创建 boolean 值。

class MyLocalThread extends Thread { 
    public void run() { 
      if(!Thread.interrupted()) {
        try {
        //do some work
       }
        catch (InterruptedException e) { 
            System.out.println("InterruptedException occur"); 
        } 
      }
    } 
}  

像这样中断线程:

MyLocalThread thread = new MyLocalThread(); 
        thread.start(); 
  // when need to stop the thread
        thread.interrupt(); 

关于java - 终止线程似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57009266/

相关文章:

android - 第三方库上的 gradle force 构建工具版本?

java - 如何使用 java 代码在 Android 中更改 ImageView 的背景颜色

c++ - 解锁互斥体的顺序在这里有区别吗?

c++ - 什么时候出队大小调用不是线程安全的?

java - 为什么 JMS 确认模式不能与 ibm mq 广泛配合使用?

java - 抛出 vs Java 字节码

java - 在没有集合的ArrayList中查找最小整数

java - 如果实例变量仍然有引用,Java GC 会销毁对象吗?

android - Linux 内核 vanilla 的分支 3.x 在 Android 下无法运行——2.6 可以

c - 即使没有其他人使用线程,线程也无法获取锁