interrupt
作用
1.对运行中的线程,仅设置了一个停止的标记,但程序照常运行。
2.对阻塞中的线程,该线程会抛出InterruptedException异常。
interrupt
方法用于中断线程。调用该方法的线程的状态为将被置为"中断"状态。
interrupt
方法只能打上一个停止标记(改变状态),不能终止一个正在运行的线程,还需要加入一个判断才停止线程。
interrupt方法的使用效果并不像 for+break 语句那样,马上就停止循环。
调用interrupt方法是在当前线程中打了一个停止标志,并不是真的停止线程。
三个主要API
1.interrupt() :中间当前线程,实际并不是马上执行;
2.interrupted(): 获取前线程的interrupt状态,关置重置interrupt状态为false,即未打interrupt状态 ;
3.isInterrupted(): 获取前线程的interrupt状态,不重置;
看个小例子,子线程中断自己
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
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(); } }
|
效果
1 2 3 4 5 6 7
| 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 判断当前线程状态
工作步骤:
- 检测当前线程是否被中断,是: 返回true,否: 返回false,
- 如果被中断,返回true,同时清除中断标志,即重置中断标志为false。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| 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{ }
|
看下如何重置状态
1 2 3 4
| public static boolean interrupted() { // 实际上就是通 isInterrupted 为 true return currentThread().isInterrupted(true); }
|