1、线程的停止方法
我们在之前的博客提到过,线程怎么创建。
线程池:
创建和启动线程:
这次我们主要介绍怎么停止线程。主要有两种方法:
- 调用stop方法停止。 方法已过时,不建议采用。且这种停止线程的方式,不能达到预期的效果。
- 使用线程的interrupt停止。有两种,一种是检查到interrupt为true时,主动停止。第二种是当线程处于阻塞状态时,调用interrupt()方法的时候,会抛出一个InterruptException,并且结束线程的等待状态,直接跳转到异常处理的代码块。
2、interrupt的用法
先来看下interrupt的用法
- interrupt:置线程的中断状态
- isInterrupt:线程是否中断
- interrupted:返回线程的上次的中断状态,并清除中断状态
可以看到,interrupt是设置线程状态的,而isInterrupt和interrupted是获取interrupt是否为true。
3、怎么使用interrupt?
1、检查状态,主动停止。
线程处于无限循环中,当检查到interrupted为true,主动break;
package com.test;
public class ThreadTest1 {
public static void main(String[] args){
Thread thread1 = new Thread(() -> {
int i = 1;
while (true) {
if (Thread.currentThread().isInterrupted()){
System.out.println("isInterrupted");
break;
}
System.out.println("i=" + i++);
}
});
thread1.start();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
thread1.interrupt();
}
}
回显:
i=1
...
i=140042
i=140043
i=140044
i=140045
i=140046
i=140047
isInterrupted
2、抛出一个InterruptException,并且结束线程的等待状态。
线程处于sleep状态,当调用interrupt时,直接抛出InterruptedException异常。
package com.test;
public class ThreadTest3 {
public static void main(String[] args){
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
long startTime = System.currentTimeMillis();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
long stopTime = System.currentTimeMillis();
System.out.println(stopTime-startTime);
System.out.println("InterruptedException");
}
}
});
thread.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("InterruptedException1");
}
thread.interrupt();
}
}
回显:
994
InterruptedException
更多内容请关注微信公众号“外里科技”