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
- Java线程:线程中断
- Java线程中断机制-如何中断线程
- 中断JAVA线程
- 中断JAVA线程
- 中断Java线程
- 中断JAVA线程
- 正确中断java线程
- 中断JAVA线程
- Java 可中断线程
- 中断Java线程
- Java 线程中断
- java线程中断
- Java线程中断
- 如何中断JAVA线程
- JAVA线程中断
- Java线程中断
- java 可中断线程
- Java中的线程中断
- 敏捷项目管理(摘录)——敏捷流程架构
- Spring 4.x官方参考文档中文版——第21章 Web MVC框架(14)
- 防御病毒邮件得看U-Mail邮件网关
- utuntu14.04 安装mosquitto-auth-plug(redis以及mongodb)遇到的问题
- windows平台上编译生成libzmq
- java 中断线程
- 自定义topbar
- c#图片与二进制流相互转换
- Log4j配置详解
- POCO库 安装
- mysql优化
- 输出1-1/2+1/3-4/1+1/5+.....=?
- 【java】Cookie实现简单浏览商品
- 使用Visual Leak Detector for Visual C++ 捕捉内存泄露