线程中断机制
中断机制
一个线程不应该由其他线程来强制 中断或停止,而是应由线程自己自行停止。所以,Thread.stop\Thread.suspend\Thread.resume被废弃
Java中没有办法立即停止一个线程,然而停止线程确实尤为重要,如:取消耗时操作。Java提供了一种停止线程的协商机制-中断,也即中断协商机制
中断只是一种协商机制,Java没有给中断增加任何方法,中断的过程需要程序员自己实现
若要中断一个线程,需要手动调用该线程的interrupt方法,该方法也仅仅是将线程对象的中断标识设成true;接着需要自己写代码检测当前线程的标识位,如果为true,表示别的线程请求这个线程中断。
每个对象中都有一个中断标识 位,用于表示线程是否被中断。该标识位为true表示中断,为false表示未中断。通过调用线程对象的interrupt方法将该线程的标识位设为true;可以在别的线程中调用,也可以在自己的线程中调用。
中断的相关API方法之三大方法说明
- interrupt()
实例方法,仅仅是设置线程的中断状态为true,发起一个协商而不会立刻停止线程
底层是 调用 native的interrupt0 方法
中断 不活动的线程不产生任何影响
如果线程处于被阻塞状态(例如 sleep、wait、join等状态),在别的线程中调用当前线程对象的interrupt方法,那么线程立即退出被阻塞状态,并抛出一个InterruptException异常
- demo 没有 Thread.currentThread().interrupt(); 二次设置中断状态,程序将进入死循环
Thread t1 = new Thread(() -> {
while (true) {
if (Thread.currentThread().isInterrupted()) {
System.out.println("程序停止");
break;
}
try {
TimeUnit.MILLISECONDS.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
Thread.currentThread().interrupt();
}
System.out.println("程序运行中……");
}
}, "t1");
t1.start();
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
new Thread(() -> {
t1.interrupt();
}, "t2").start(); - interrupted()
判断线程是否被中断并清除当前中断状态
- 返回当前线程的中断状态,测试当前线程是否已被中断
- 将当前线程的中断状态清零并重新设置为true,清除线程的中断状态
isInterrupted()
判断当前线程是否被中断 true 希望被中断
中断运行中的线程
- 通过一个volatile变量实现
定义变量
static volatile boolean isstop = false; 示例
new Thread(() -> {
while (true) {
if (isstop) {
System.out.println("程序停止");
break;
}
System.out.println("程序运行中……");
}
}, "t1").start();
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
new Thread(() -> {
isstop = true;
}, "t2").start();
- 通过AtomicBoolean实现
定义原子变量
static volatile AtomicBoolean isStopMark = new AtomicBoolean(false); 示例
new Thread(() -> {
while (true) {
if (isStopMark.get()) {
System.out.println("程序停止");
break;
}
System.out.println("程序运行中……");
}
}, "t1").start();
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
new Thread(() -> {
isStopMark.set(true);
}, "t2").start(); - 通过Thread类自带的中断api实例方法实现
在需要中断的线程中 不断监听中断状态,一旦发生中断,就执行相应的中断处理业务逻辑stop线程
示例
Thread t1 = new Thread(() -> {
while (true) {
if (Thread.currentThread().isInterrupted()) {
System.out.println("程序停止");
break;
}
System.out.println("程序运行中……");
}
}, "t1");
t1.start();
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
new Thread(() -> {
t1.interrupt();
}, "t2").start(); 中断标识为true,线程是否立刻停止
静态方法 Thread.Interrupted() 理解
- 本文标签: Java
- 本文链接: http://119.91.109.247:8443//article/81
- 版权声明: 本文由张亚东原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权