方法原型:public void interrupt()
方法说明:
- 中断线程
- 如果当前线程没有中断它自己(这在任何情况下都是允许的),则该线程的checkAccess()方法就会被调用,这可能抛出SecurityException
- 如果线程在调用Object类的wait()、wait(long)或者wait(long, int)方法,或者该类的join()、join(long)、join(long, int)、sleep(long)或者sleep(long, int)方法过程中受阻,则其中断状态将会被清除,它还将抛出一个InterruptedException
- 如果该线程在可中断的通道(InterruptibleChannel)上I/O操作中受阻,则该通道将被关闭,该线程的中断状态将被设置并且该线程将受到一个CloseByInterruptException
- 如果该线程在一个Selector中受阻,则该线程的中断状态将被设置,它将立即从选择操作返回,并可能带有一个非零值,就好像调用了选择器的wakeup方法一样
- 如果以前的条件都没有保存,则该线程的中断状态将被设置
示例1:测试interrupt()方法
public class Hello implements Runnable { private double d = 0.0; public void run() { //死循环执行打印“I am running”和消耗时间的浮点数运算 while (true) { System.out.println("I am running!"); for (int i = 0; i < 900000; i++) { d = d + (Math.PI + Math.E) / d; } //给线程调度器可以调度其它线程的信号 Thread.yield(); } } public static void main(String[] args) throws InterruptedException { Thread t = new Thread(new Hello()); System.out.println("线程的中断状态1:" + t.isInterrupted()); t.start(); t.sleep(100); System.out.println("*****************************"); System.out.println("Interrupted Thread!"); System.out.println("*****************************"); t.interrupt(); System.out.println("线程的中断状态2:" + t.isInterrupted()); } }
I am running!
... ...
I am running!
I am running!
*****************************
Interrupted Thread!
*****************************
线程的中断状态2:true
I am running!
I am running!
... ...
分析:程序虽然调用了interrupt()方法,但是并没有中断执行,而是继续运行。但是interrupt状态由false变为了true。由此得出结论,线程的“中断”不是让线程停止。
Java中线程的中断(interrupt)只是改变了线程的中断状态,这个中断状态改变后带来的结果,是无法确定的。有时,它更是让停止中的线程继续执行的唯一手段,不但不是让线程停止运行的手段,反而是继续执行线程的手段。
离开线程有两种方法:
1、抛出InterruptedException异常
2、用Thread.interrupted()检查是否发生中断
示例2:抛出InterruptedException异常
public class Hello implements Runnable { private double d = 0.0; public void run() { try { //死循环执行打印“I am running”和消耗时间的浮点数运算 while (true) { System.out.println("I am running!"); for (int i = 0; i < 900000; i++) { d = d + (Math.PI + Math.E) / d; } //休眠一段时间,中断后会抛出InterruptedException异常, //当抛出该异常的时候,当前线程的"中断状态"被清除。 Thread.sleep(50); } } catch (InterruptedException e) { e.printStackTrace(); } } public static void main(String[] args) throws InterruptedException { Thread t = new Thread(new Hello()); System.out.println("线程的中断状态1:" + t.isInterrupted()); t.start(); t.sleep(100); System.out.println("*****************************"); System.out.println("Interrupted Thread!"); System.out.println("*****************************"); t.interrupt(); System.out.println("线程的中断状态2:" + t.isInterrupted()); } }
I am running!
I am running!
*****************************
Interrupted Thread!
*****************************
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at com.test2.Hello.run(Hello.java:16)
at java.lang.Thread.run(Thread.java:744)
线程的中断状态2:false
分析:如代码及执行结果所示,子线程run()方法中,每执行一次循环体,就会休眠50ms,当主线程执行到t.interrupt()操作的时候,子线程的中断状态将会改变为true,子线程再执行Thread.sleep()方法的时候,会抛出java.lang.InterruptedException异常,此时子线程的中断状态将会被重置,所以在最后的输出中,子线程的中断状态还是false。
特别注意:run()中的try-catch块,必须将整个while循环括在try块中。如果单独只是括sleep()方法,则线程不会被终止,而是继续执行,原因就是sleep()方法抛出的异常已经被捕获了,而这个被捕获的异常并没有影响到后续程序的运行。
示例3:用Thread.interrupted()检查是否发生中断
public class Hello implements Runnable { private double d = 0.0; public void run() { try { //判断程序是否发生中断 while (!Thread.interrupted()) { System.out.println("I am running!"); for (int i = 0; i < 900000; i++) { d = d + (Math.PI + Math.E) / d; } //休眠一段时间,中断后会抛出InterruptedException异常, //当抛出该异常的时候,当前线程的"中断状态"被清除。 Thread.sleep(50); } } catch (InterruptedException e) { e.printStackTrace(); } } public static void main(String[] args) throws InterruptedException { Thread t = new Thread(new Hello()); System.out.println("线程的中断状态1:" + t.isInterrupted()); t.start(); t.sleep(100); System.out.println("*****************************"); System.out.println("Interrupted Thread!"); System.out.println("*****************************"); t.interrupt(); System.out.println("线程的中断状态2:" + t.isInterrupted()); } }
I am running!
I am running!
*****************************
Interrupted Thread!
*****************************
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at com.test2.Hello.run(Hello.java:17)
at java.lang.Thread.run(Thread.java:744)
线程的中断状态2:false
I am running!
I am running!
*****************************
Interrupted Thread!
*****************************
线程的中断状态2:true
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at com.test2.Hello.run(Hello.java:17)
at java.lang.Thread.run(Thread.java:744)
分析:
- isInterrupted():测试线程是否中断。线程的“中断状态”不受方法的影响。在新版的jre(7)中该结论需要斟酌,个人理解如果没有错的话,isInterrupted()也可能会影响线程的中断状态。
- interrupted():测试当前线程是否已经中断。线程的“中断状态”由该方法清除。换句话说,如果连续两次调用该方法,则第二次调用将返回false(在第一次调用已经清除了其中断状态之后,且第二次调用检查完中断状态前,当前线程再次中断的情况除外)。详见以下补充示例。
- 多执行几次,会出现两个截然不同的结果(最后一次测试中断状态的结果完全相反)。个人理解,由于sleep()方法执行的时间点不同,从而影响了该结果。
补充示例:interrupted()方法验证
public class Hello implements Runnable { private double d = 0.0; public void run() { //判断程序是否发生中断,第一次调用interrupted()方法 while (!Thread.interrupted()) { System.out.println("I am running!"); for (int i = 0; i < 900000; i++) { d = d + (Math.PI + Math.E) / d; } } System.out.println("第二次调用Thread.interrupted()方法:" + Thread.interrupted()); } public static void main(String[] args) throws InterruptedException { Thread t = new Thread(new Hello()); System.out.println("线程的中断状态1:" + t.isInterrupted()); t.start(); t.sleep(100); System.out.println("*****************************"); System.out.println("Interrupted Thread!"); System.out.println("*****************************"); t.interrupt(); System.out.println("线程的中断状态2:" + t.isInterrupted()); } }
I am running!
I am running!
I am running!
I am running!
I am running!
I am running!
I am running!
I am running!
I am running!
I am running!
I am running!
I am running!
I am running!
I am running!
I am running!
*****************************
Interrupted Thread!
*****************************
线程的中断状态2:true
第二次调用Thread.interrupted()方法:false
注:本文源自互联网,经过查阅网上资料整理而成,如涉及到他人整理的成果,在此表示感谢。由于涉及到的参考文章比较多,在此就不再一一列举。
本文是目前个人理解的结果,仅供参考,如后续发现问题,本人会进行相应的更正,也欢迎各位对Java线程感兴趣的朋友或者前辈进行指正。
相关推荐
### Java线程学习笔记 #### 一、Java进程与线程概述 在Java中,一个JVM(Java虚拟机)实例本质上就是一个进程。进程在Java中由`java.lang.Process`类表示,它允许Java程序与操作系统进行交互,执行外部程序。进程...
- Java线程有10个优先级,从MIN_PRIORITY(1)到MAX_PRIORITY(10),默认优先级是NORM_PRIORITY(5)。 - 优先级高的线程并不保证一定先执行,线程调度还受到操作系统的限制。 6. **线程中断** - **interrupt()...
这篇“Java线程编程学习笔记(二)”很可能是对Java并发编程深入探讨的一部分,特别是涉及多线程示例的实践应用。我们将从标题、描述以及标签来推测可能涵盖的知识点,并结合"Multi-Threads Demo"这一压缩包文件名来...
学习Java多线程编程不仅涉及到线程的创建和启动,还包括线程同步(如`synchronized`关键字、`wait()`, `notify()`, `notifyAll()`方法)、线程间通信(`BlockingQueue`、`Future`、`ExecutorService`)、线程池(`...
- **线程的停止**:线程不能被外部强制停止,应通过共享变量或中断标志来提示线程结束,让线程自行释放资源并退出。 3. **线程类型** - **用户线程**:正常执行任务的线程,进程会等待所有用户线程执行完毕后才...
本笔记全面涵盖了多线程的学习,包括基础理论和实践代码,旨在帮助开发者深入理解并掌握Java多线程技术。 一、线程基础知识 线程是操作系统分配CPU时间的基本单位,一个进程中可以包含多个线程。Java通过`Thread`类...
"Java超强学习笔记"显然是一份全面且深入的Java学习资料,由一位极具洞察力和组织能力的作者精心编纂。这份笔记可能包含了从基础知识到高级特性的全方位讲解,旨在帮助学习者构建坚实的Java编程基础,并提升他们的...
9. **线程中断**:通过Thread.interrupt()方法可以请求中断一个线程,线程在运行过程中应定期检查中断标志,以便优雅地结束运行。 10. **线程间的通信**:Java的BlockingQueue接口和相关的类(如ArrayBlockingQueue...
在计算机科学中,多线程是一种编程模型,允许一个应用程序同时执行多个任务。这提高了系统的效率,特别是对于处理大量并发操作的情况。以下是一些关于多线程的重要知识点,特别是关于在Linux和Windows环境下创建和...
本学习笔记将深入探讨Java多线程的相关知识,包括其原理、实现方式、同步机制以及常见问题。 ### 一、多线程的基本概念 多线程是指在一个程序中存在两个或更多的执行线程,这些线程共享同一内存空间,但各自拥有...
在这个学习笔记中,主要讨论了Java中的线程同步机制,包括volatile关键字、synchronized以及Lock接口,特别是ReentrantLock的使用。 首先,对于线程1和线程2的疑惑,调试(debug)模式并不能改变线程的执行顺序。...
Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,从而提高系统效率和资源利用率。在Java中,实现多线程有两种主要方式:通过实现`Runnable`接口和继承`Thread`类。 首先,让我们从创建线程开始。当...
通过提供的"线程学习笔记2.docx"和"线程笔记20140606.docx"文档,你可以更深入地学习线程的这些概念和实践技巧,结合具体的代码示例和实践经验,加深对线程编程的理解。这些文档可能包含了一些实例代码、问题解析、...
Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,从而提高系统效率。在Java中,实现多线程主要有两种方式:通过继承Thread类和实现Runnable接口。Thread类提供了创建新线程的基本功能,而Runnable...
Java提供了interrupt()方法来中断线程,但需要注意的是,中断并不会立即终止线程,而是设置线程的中断标志。线程可以通过检查中断标志来决定是否结束执行,例如在while循环中检查isInterrupted()或在捕获...
首先,我们来了解一下Java线程。线程是程序执行的基本单元,允许多个任务在同一时间运行,从而提高了系统资源的利用率。在Java中,可以使用`Thread`类或实现`Runnable`接口来创建线程。线程的状态包括新建、就绪、...
#### 五、Java多线程学习笔记 ##### 1. 线程类 - **Thread类**: - 提供了创建和控制线程的方法。 - 可以通过继承`Thread`类或实现`Runnable`接口来创建线程。 ##### 2. 等待一个线程的结束 - **join()方法**: -...
在Java编程语言中,多线程是程序设计中的一个重要概念,尤其在开发高效能和响应迅速的应用时。本文档将全面解析多线程的基础知识,从简单到复杂,帮助开发者深入理解并掌握这一核心技术。 一、多线程基础 1.1 线程...
”则提示这是一份个人学习笔记,包含了作者在掌握Java多线程编程时编写的示例代码。 【描述】中的信息虽然不完整,但从“从Java基础的数据类型、jdk1.”我们可以推测,这个资源不仅限于多线程部分,可能还涵盖了...
本篇笔记将深入探讨Java中的并发同步机制,包括核心概念、工具类以及在实际开发中的应用。 首先,我们要理解什么是线程安全。线程安全是指在多线程环境下,一个方法或类能够正确处理多个线程同时访问的情况,不会...