位于Thread类里面的interrupt()方法,它的作用就是中断线程。
从两个方面演示该方法。
1.停止正在运行的线程。
2.停止休眠中的线程
>step1.自定义一个任务,其中内容如下:
public class Task implement Runnable {
@Override
public void run() {
While(true){
System.out.println("正在运行。");
}
}
}
>step2.运行线程并执行interrupt方法
public static void main(String[] args) {
Task task = new Task(); // 创建任务对象
Thread thread = new Thread(task); // 创建线程对象,并将任务传入线程
thread.start(); // 启动线程
Thread.sleep(1000); //让程序暂停1秒,可以看出效果
thread.interrupt();// 停止线程。
}
>step3.查看运行结果。
正在运行。
正在运行。
正在运行。
正在运行。
正在运行。
.
(一直打印)
.
正在运行。
>step4.这里发现了问题,执行结果却一直在打印!!为什么?
为什么一直打印?因为interrupt()只是仅仅将线程标记为中断状态,实际并没有去停止这个线程。如果想要线程停下来,则需要我们手动去判断线程是否被中断,然后对此做出反应。
方法名称 | 类型 | 作用 |
---|---|---|
isInterrupted | 非表态方法 | 判断线程是否被中断 |
interrupted | 静态方法 | 判断线程是否被中断,并清除中断标记 |
/**
* 判断线程是否被中断
* @return 线程被中断返回true,否则返回false
*/
public boolean isInterrupted()
>使用
public class Task implements Runnable{
@Override
public void run(){
// 无限打印语句
while(true){
// 获取当前正在执行的线程
Thread thread = Thread.currentThread().
if(thread.isInterrupted()) {
break;// 结束循环
}
System.out.println("正在运行。");
}
}
}
下面来看一下interrupt()方法。
/**
* 判断线程是否被中断,并清除中断标记
* @return 线程被中断返回true,否则返回false
*/
public boolean interrupted()
>使用
public class Task implements Runnable{
@Override
public void run(){
// 无限打印语句
while(true){
// 当线程被中断时
if(Thread.interrupted()) {
break;// 结束循环
}
System.out.println("正在运行。");
}
}
}
下面介绍下当使用interrupt方法中断正在休眠中的线程会导致什么样的结果。
public class Task implements Runnable{
@Override
public void run(){
try{
Thread.sleep(10000);// 让当前线程休眠10秒。
}catch(Exception e){
e.printStackTrace().
}
}
}
运行该线程
public static void main(String[] args){
Task task = new Task();
Thread thread = new Thread(task);
thread.start();
thread.interrupt();// 此时该线程正在休眠,突然调用interrupt()停止后,则会抛出异常,该异常是中断正在休眠中的线程引发的。
}
Exception:
java.lang.InterruptedException:sleep interrupted
at java.lang.Thread.sleep(Native Method)
at main.Task.run(Task.java:11)
...
网友评论