本篇文章的目的是了解ava 线程中的中断,通过对Java API中的 void interrupt()、boolean interrupted()、boolean isInterrupted() 的介绍来了解java 的线程中断 。
首先让我们了解一下什么是线程中断,java 的线程中断是一种线程状态,当一个线程处于中断状态时,调用该线程的sleep方法会抛InterruptedException异常。
那么问题来了,在什么情况下会出现线程中断呢?线程在运行的情况下是不会中断的,只有调用该线程的interrupt()方法时,线程才会处于中断状态,被中断的线程调用 sleep() 方时或线程处于sleep状态下调用线程的interrupt()方法时会抛InterruptedException异常。
我们用代码来测试一下,测试思路是我们创建一个线程,这种线程的run 方只有sleep() ,我们在线程sleep方调用时要线程处于中断状态。
在编写程序前我们先对相关的api做一下简单的介绍
void interrupt() ; // 向线程发送中断请求。线程的中断状态设置为true。
static boolean interrupted();// 测试当前线程是否处于中断状态,执行该方法会将线程的中断状态设置为false。
boolean isInterrupted() ;// 测试当前线程是否处于中断状态。
static void currentThread();// 获取当前线程。
/**
* @author boo
* 线程中断
*/
public class Dome01
{
public static void main(String[] args) throws InterruptedException
{
final int threeSecond = 3000, oneSecond = 1000;
Thread sleep = new Thread(new Runnable()
{
public void run()
{
try
{
Thread.currentThread().interrupted();
System.out.println(Thread.currentThread().getName() + " run Thread type " + Thread.currentThread().isInterrupted());
// 阻塞4秒
Thread.sleep(threeSecond + oneSecond);
} catch (InterruptedException e)
{
System.out.println(Thread.currentThread().getName() + " 被中断了");
e.printStackTrace();
}
}
}, "Thread-0");
sleep.start();
System.out.println(sleep.getName() + " 线程状态 " + sleep.isInterrupted());
Thread.sleep(threeSecond);// 确保线程Thread-0 处于睡眠状态
sleep.interrupt();
System.out.println(sleep.getName() + " 执行interrupt 后的线程状态 " + sleep.isInterrupted());
}
}
运行结果
Thread-0 线程状态 false
Thread-0 run Thread type false
Thread-0 被中断了
Thread-0 执行interrupt 后的线程状态 false
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at com.sinosoft.settlement.maven.Dome01$1.run(Dome01.java:21)
at java.lang.Thread.run(Thread.java:745)
结果分析
测试思路很简单,无非是看看下面的代码谁先执行
1. Thread.currentThread().interrupted();
2. sleep.interrupt();
如果方法1 先与方法2执行,并且方法一所在线程在sleep 中调用了方法2 那么线程就会抛出InterruptedException异常。