juc10-线程中断interrupt

2023-10-20 10:09:07 浏览数 (2)

interrupt

作用

1.对运行中的线程,仅设置了一个停止的标记,但程序照常运行。 2.对阻塞中的线程,该线程会抛出InterruptedException异常。

interrupt方法用于中断线程。调用该方法的线程的状态为将被置为"中断"状态。 interrupt方法只能打上一个停止标记(改变状态),不能终止一个正在运行的线程,还需要加入一个判断才停止线程。

interrupt方法的使用效果并不像 for break 语句那样,马上就停止循环。 调用interrupt方法是在当前线程中打了一个停止标志,并不是真的停止线程。

三个主要API 1.interrupt() :中间当前线程,实际并不是马上执行; 2.interrupted(): 获取前线程的interrupt状态,关置重置interrupt状态为false,即未打interrupt状态 ; 3.isInterrupted(): 获取前线程的interrupt状态,不重置;

看个小例子,子线程中断自己

代码语言:javascript复制
/**
 * 主动中断线程
 */
public class MyThread extends Thread {
  @Override
  public void run(){
    super.run();
    try {
        for(int i=0; i<5000; i  ){
            if (i == 100) {
                System.out.println("主动中断线程");
                Thread.currentThread().interrupt();
            }
            System.out.println("i=" (i 1));
            Thread.sleep(100);
        }
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
  }
}

class Run {
  public static void main(String args[]){
    Thread thread = new MyThread();
    thread.start();
  }
}

效果

代码语言:javascript复制
i=99
i=100         //这里调用了,但是并没有马上中断
主动中断线程
i=101
java.lang.InterruptedException: sleep interrupted
      at java.lang.Thread.sleep(Native Method)
      at com.liukai.algorithm.practise.tree.MyThread.run(MyThread.java:18)

interrupted 判断当前线程状态

工作步骤:

  1. 检测当前线程是否被中断,是: 返回true,否: 返回false,
  2. 如果被中断,返回true,同时清除中断标志,即重置中断标志为false。
代码语言:javascript复制
public class Test1 {

  public static void main(String[] args) {
    test();
  }
  public static void test() {
    try {
      TestThread testThread = new TestThread();
      System.out.println("start");
      testThread.start();
      testThread.sleep(1000);
      testThread.interrupted();
      System.out.println("是否中断1 "   testThread.isInterrupted());
      System.out.println("是否中断2 "   testThread.isInterrupted());
    } catch (InterruptedException e) {
      System.out.println("main catch");
      e.printStackTrace();
    }
    System.out.println("end");
  }
}

class TestThread extends Thread{
}

看下如何重置状态

代码语言:javascript复制
public static boolean interrupted() {
    // 实际上就是通 isInterrupted 为 true
    return currentThread().isInterrupted(true);
}

0 人点赞