1 线程中断interrupt
中断机制的实现是通过一个标记中断状态(interrupt status
)实现的。我们通过调用某个线程对象的interrupt
方法只是来设置这个标记,而并非直接终止线程的运行。当一个线程调用了Thread的静态方法interrupted判断到自己被中断后,立即会将这个状态清空。但是如果调用Thread的实例方法Isinterrupted判断,则不会清空中断状态。总的来说,线程如何支持中断,这依赖于线程的运行时代码是如何编写的。
当使用interrupt
方法中断了一个处于阻塞或者正试图执行阻塞操作的线程时,将会抛出一个InterruptedException异常,更重要的是,中断状态将会被复位。所以下面这种检测中断的方式将失效:
Thread t1 = new Thread() { @Override public void run() { while (!this.isInterrupted()) { //失效的中断检测 try { System.out.println("sleep().."); TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { //抛异常就会清空中断状态 System.out.println("InterruptedException...."); } } } }; t1.start(); TimeUnit.SECONDS.sleep(2); t1.interrupt();
由于当InterruptedException异常被抛出之后,中断状态将被复位,所以当再次使用Isinterrupted/interrupted判断时,将仍然是非中断状态,线程将不能得到停止。
另一方面,如果线程运行时代码不存在阻塞的代码时,并且没有检测线程中断状态的机制,那么就算调用了interrupt方法中断该线程,该线程也不会得到任何响应,如下面的代码将无法中断非阻塞状态的线程:
Thread t1=new Thread(){ @Override public void run(){ while(true){ System.out.println("未被中断"); } } }; t1.start(); TimeUnit.SECONDS.sleep(2); t1.interrupt(); /** * 输出结果(无限执行): 未被中断 未被中断 未被中断 ...... */
所以,综上情况,最好的中断运行时代码示例如下这种形式:
public void run(){ try { //判断当前线程是否已中断,注意interrupted方法是静态的,执行后会对中断状态进行复位 while (!Thread.interrupted()) { TimeUnit.SECONDS.sleep(2); } } catch (InterruptedException e) { } }
总结:
方法名 | 类型 | 作用 | 是否复位标记 |
public void interrupt() | 实例方法 | 中断线程 | 当一个线程处于被阻塞状态或者试图执行一个阻塞操作时,使用interrupt()方式中断该线程,将会抛出一个InterruptedException的异常,同时中断状态将会被复位(由中断状态改为非中断状态) |
public boolean isInterrupted() |
实例方法 | 判断线程是否被中断 | |
public static boolean interrupted() |
静态方法 | 判断线程是否被中断 | 中断状态将会被复位 |
特别的:抛出 InterruptedException异常的同时也会清空中断状态
2 线程合并Join
Thread类的非静态方法,其作用:在A线程执行过程中如果调用了另外一个线程对象B的join方法B.join(),那么A线程后面的代码必须要等待B线程执行结束之后才能继续往下执行。B.Join之后,A线程进入阻塞状态,并且不会释放所占用的资源,当B线程运行结束,A线程重新进人可运行状态,等待被操作系统调度执行。
public static void main(String[] args) throws InterruptedException { Thread t = 创建t线程实例. t.start();//t线程启动 t.join();//合并t线程到当前线程(main线程) System.out.println("这里的代码必须等到t线程执行结束之后才会得到执行。"); }join方法还可以指定等待的时间,一旦A线程在等待了指定的时间后,B线程还没有结束,就不再等待,A线程再次进入可运行状态。
相关推荐
第二章 Java线程API 通过Thread类创建线程 使用Runable接口的线程 线程的生命周期 线程命名 访问线程 线程的启动、停止和连接 总结 第三章 同步技术 银行的例子 异步读取数据 一个进行同步操作的类 同步块 嵌套锁...
本文档是 Java 2 Platform Standard Edition 6.0 的 API 规范。 请参见: 描述 Java 2 Platform 软件包 java.applet 提供创建 applet 所必需的类和 applet 用来与其 applet 上下文通信的类。 java.awt 包含...
java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 JAR ...
JAVA开发人员最新版本7.0 api文档!本文档是 Java Platform Standard Edition 7 的 API !Java 1.7 API的中文帮助文档。 深圳电信培训中心 徐海蛟博士教学用api 7.0中文文档。支持全文检索,在线即时查询。 里面列...
java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 ...
Java语言概述 Java开发基础--Java语言概述 Java语言概述 了解Java语言历史和特点 理解Java语言规范 能够区分API、JDK的含义 Java的发展历史 1991年,Sun公司James Gosling领导的Green小组创建了一种新型语言,命名为...
java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 ...
1.6 Java线程 1.7 Java 5.0多线程编程 1.8 Java Socket编程 1.9 Java的内存泄漏 1.10 抽象类与接口的区别 1.11 Java变量类型间的相互转换 2 JAVA与WEB 2.1 JMX规范 2.1.1 JMX概述 2.1.2 设备层(Instrumentation ...
java.awt.geom 提供用于在与二维几何形状相关的对象上定义和执行操作的 Java 2D 类。 java.awt.im 提供输入方法框架所需的类和接口。 java.awt.im.spi 提供启用可以与 Java 运行时环境一起使用的输入方法开发的...
一个用于 Java 的简约多线程爬虫 API。 分散其简约的结构,此爬虫基于 Java ForkJoin 框架,该框架允许 RexCrawler 通过将其本地工作负载分区来按需创建其他守护进程。 这种方法的一个关键好处是更好地控制粒度和更...
Java Thread API 允许程序员编写具有多处理机制优点的应用程序,在后台处理任务的同时保持用户所需的交互感。Alex Roetter 介绍了 Java Thread API,并概述多线程可能引起的问题以及常见问题的解决方案。
二十二、 Java其他总结 248 Java JVM知识点总结 248 equals()方法和hashCode()方法 270 数据结构 273 Array方法类汇总 304 Java数组与集合小结 305 递归 309 对象的序列化 310 Java两种线程类:Thread和Runnable 315...
Java语言基础 Java网络编程技术 Java程序设计使用教程 第01章 java语言概述(共43页).ppt Java语言基础 Java网络编程技术 Java程序设计使用教程 第02章 java语言基础(共112页).ppt Java语言基础 Java网络编程技术...
1.6 Java线程 60 1.7 Java 5.0多线程编程 65 1.8 Java Socket编程 80 1.9 Java的内存泄漏 85 1.10 抽象类与接口的区别 86 1.11 Java变量类型间的相互转换 87 2 JAVA与WEB 87 2.1 JMX规范 87 2.1.1 JMX概述 87 2.1.2 ...
java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 JAR ...
【完整课程列表】Java语言基础 Java网络编程技术 Java程序设计使用教程 第01章 java语言概述(共43页).pptJava语言基础 Java网络编程技术 Java程序设计使用教程 第02章 java语言基础(共112页).pptJava语言基础 ...