java 中断线程

来源:互联网 发布:nba2k17奥尼尔身体数据 编辑:程序博客网 时间:2024/05/21 19:49

线程在运行过程中,如果我们希望线程可以中断,则可以使用以下方法,停下来之后我们可以决定线程是终止下来 还是继续执行,本质上来说,中断只是一个线程信号,希望能引起线程的注意。本文中,我们中断之后采用终止执行。

使用Interrupt()中断线程:

interrupt方法实际上是让程序发生抛出一个InterruptedException(被中止异常。当某个线程处于长时间的等待、休眠或其他暂停状态,而此时其他的线程通过Thread的interrupt方法终止该线程时抛出该异常。)的异常,就实现了中断效果。然后在异常中返回,达到终止线程的效果。

如下例子:

public static void main(String[] args) throws InterruptedException {// TODO Auto-generated method stubMyThread2 m=new MyThread2();Thread stopThread=new Thread(m);stopThread.start();Thread.sleep(20); //挤时间 给MyThread2System.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 exceptionSystem.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 stubMyThread2 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 exceptionSystem.out.println("MyThead2线程收到中断信号");return;}        }  } 
输出结果:

MyThread2线程开始执行主线程开始发送中断信号中断状态trueMyThead2线程收到中断信号中断状态false


我们可以看到我们中断线程之后,中断状态为true的,收到中断信号之后,也即是调用Sleep方法发生异常后,中断状态被清除,所以false。

第二种使用类方法Thread.Interruptd判断是否在中断状态,由于它是类方法,所以只能在返回调用他的线程的中断状态,并且在第二次调用后返回false;

 */public static void main(String[] args) throws InterruptedException {// TODO Auto-generated method stubThread.currentThread().interrupt();System.out.println("中断状态"+Thread.interrupted());System.out.println("中断状态"+Thread.interrupted());}


输出结果:

中断状态true中断状态false


0 0