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 2 Platform Standard Edition 6.0 的 API 规范。 请参见: 描述 Java 2 Platform 软件包 java.applet 提供创建 applet 所必需的类和 applet 用来与其 applet 上下文通信的类。 java.awt 包含...
第二章 Java线程API 通过Thread类创建线程 使用Runable接口的线程 线程的生命周期 线程命名 访问线程 线程的启动、停止和连接 总结 第三章 同步技术 银行的例子 异步读取数据 一个进行同步操作的类 同步块 嵌套锁...
### Java线程使用教程知识点详解 #### 一、线程基础概述 - **定义与特点**:线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。Java是首个在语言级别明确支持线程特性的...
java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 JAR ...
在Java API文档中,我们可以找到关于Java语言的基本类、集合框架、网络编程、多线程、I/O流、反射、异常处理、国际化、日期时间、XML处理等多个领域的详细说明。以下是一些关键知识点的概述: 1. **基础类与接口**...
以上是Java语言概述的一些核心知识点,涵盖语言基础、内存管理、异常处理、I/O、集合、多线程和网络编程等方面。通过深入学习和实践,开发者可以掌握Java编程的基本技能,并在此基础上构建复杂的应用系统。
以上只是Java 6 API中一部分关键知识点的概述,实际的API字典会包含更多详细的类、接口和方法描述,帮助开发者更好地理解和利用Java平台的强大功能。通过深入学习和实践,开发者可以提升编程技能,编写出高效、稳定...
以上只是Java API中部分重要知识点的概述,实际的API文档中还包含了更多的类和接口,涵盖了各种功能和用途,是Java开发者必备的学习资料。通过深入理解和熟练使用Java API,开发者可以构建出稳定、高效、可扩展的...
API文档是Java开发者的重要参考资料,它详细阐述了每个类、接口、方法和常量的功能、用法及参数说明,极大地方便了开发过程。 **JDK1.6主要特性** 1. **泛型**:在JDK1.6中,泛型的使用更加广泛和成熟,允许开发者...
2. **开发工具**:JDK提供了一系列的命令行工具,如`javac`编译器将源代码编译成字节码,`java`解释器执行编译后的.class文件,`javadoc`用于生成API文档,`jdb`是Java的调试工具等。 3. **Java虚拟机(JVM)**:...
1. **Java API概述**: Java API(Application Programming Interface)是一组预先定义的类库,提供了丰富的功能和接口,使得开发者可以构建高效、可移植的应用程序。J2SE 5.0 API包含了核心Java语言库、集合框架、...
Java线程学习笔记涉及了Java多线程编程的多个关键知识点,本篇知识点整理将详细解释每个概念及其在Java中的实现方式。 基本知识部分包含了Java线程编程的基础内容,它们是并发编程的基石。 任务Runnable是一个接口...
### Java线程定时启动知识点详解 #### 一、概述 在Java编程中,有时我们需要让某个任务或操作在特定的时间点或每隔一段时间自动执行一次。这通常被称为“定时任务”。Java标准库提供了几种不同的方式来实现定时...
#### 一、Java API 概述 Java API(Application Programming Interface)是Java编程语言的核心组成部分之一,它提供了一系列预定义的类和接口,使得开发者能够轻松地实现复杂的功能而无需从零开始编写代码。Java ...
随着学习深入,还可以探索更高级的主题,如Spring框架、JPA(Java Persistence API)进行数据库操作、JavaFX进行图形用户界面开发,以及近年来热门的Java 8及更高版本的新特性,如Lambda表达式、Stream API等。...
### Java API概述 Java API(Application Programming Interface)是指Java平台提供的一系列预定义函数,用于简化Java程序开发过程中的复杂操作。API提供了大量的类库和接口,帮助开发者实现各种功能而无需从头编写...
1. **Java API概述** Java API是Java语言的核心,它提供了大量的预定义类和接口,涵盖了从基本数据类型操作到网络编程、多线程、I/O流等各个领域。Java 1.8版本引入了许多新特性,如Lambda表达式、Stream API、方法...
JAVA开发人员最新版本7.0 api文档!本文档是 Java Platform Standard Edition 7 的 API !Java 1.7 API的中文帮助文档。 深圳电信培训中心 徐海蛟博士教学用api 7.0中文文档。支持全文检索,在线即时查询。 里面列...
Java API 涵盖了 Java 核心库的各个方面,包括集合框架、输入/输出、网络编程、多线程、图形用户界面(GUI)、数据库连接等。 2. **Java 类库** Java 1.6 包含了大量的核心库,如 `java.lang`、`java.io`、`java....
1. **Java类库概述**:Java API 1.6包括了Java基础类库,如集合框架、I/O流、网络编程、多线程、反射、国际化等。这些类库为开发者提供了构建复杂应用程序的基础。 2. **集合框架**:Java 1.6中的集合框架包括List...