线程在运行过程中,如果我们希望线程可以中断,则可以使用以下方法,停下来之后我们可以决定线程是终止下来 还是继续执行,本质上来说,中断只是一个线程信号,希望能引起线程的注意。本文中,我们中断之后采用终止执行。
使用Interrupt()中断线程:
interrupt方法实际上是让程序发生抛出一个InterruptedException(被中止异常。当某个线程处于长时间的等待、休眠或其他暂停状态,而此时其他的线程通过Thread的interrupt方法终止该线程时抛出该异常。)的异常,就实现了中断效果。然后在异常中返回,达到终止线程的效果。
如下例子:
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
MyThread2 m=new MyThread2();
Thread stopThread=new Thread(m);
stopThread.start();
Thread.sleep(20); //挤时间 给MyThread2
System.out.println("主线程开始发送中断信号");
stopThread.interrupt();
}
class MyThread2 implements Runnable{
private int ticket = 5;
public void run(){
try {
System.out.println("MyThread2线程开始执行");
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO: handle exception
System.out.println("MyThead2线程收到中断信号");
return;
}
System.out.println("MyThread2线程执行完毕");
}
}
输出结果:
MyThread2线程开始执行
主线程开始发送中断信号
MyThead2线程收到中断信号
通过以上输出结果我们可以看到,线程在使用Interrupt方法后,抛出了异常,在异常中我们使用return的关键字,中断了线程,如果不使用return关键字,程序在抛出异常后,将打印出“myThread2线程执行完毕”。
线程中断状态的检测
这里我们有两种方法检测,第一种可以使用对象方法isInterruptd来检测线程是否处于中断状态,如果是在中断状态返回true, 否则返回false。另外在线程中,一个线程对象调用wait(),join(),sleep()都会清除中断标志。看以下例子:
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
MyThread2 m=new MyThread2();
Thread stopThread=new Thread(m);
System.out.println("MyThread2线程开始执行");
stopThread.start();
System.out.println("主线程开始发送中断信号");
stopThread.interrupt();
System.out.println("中断状态"+stopThread.isInterrupted());
stopThread.sleep(200);//让时间给stopThread线程
System.out.println("中断状态"+stopThread.isInterrupted());
}
class MyThread2 implements Runnable{
private int ticket = 5;
public void run(){
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO: handle exception
System.out.println("MyThead2线程收到中断信号");
return;
}
}
}
输出结果:
MyThread2线程开始执行
主线程开始发送中断信号
中断状态true
MyThead2线程收到中断信号
中断状态false
我们可以看到我们中断线程之后,中断状态为true的,收到中断信号之后,也即是调用Sleep方法发生异常后,中断状态被清除,所以false。
第二种使用类方法Thread.Interruptd判断是否在中断状态,由于它是类方法,所以只能在返回调用他的线程的中断状态,并且在第二次调用后返回false;
*/
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
Thread.currentThread().interrupt();
System.out.println("中断状态"+Thread.interrupted());
System.out.println("中断状态"+Thread.interrupted());
}
输出结果:
中断状态true
中断状态false