在《Java网络编程》上看到一个例子, 说是用thread.interrupt()去关闭在等待的线程。不太明白,于是去查了一下Java的API。
有兴趣的同行们可以先看看API的内容,再看以下总结:
1. thread.isInterrupt()和Thread.interrupted()都返回当前线程interrupt的状态
-
thread.isInterrupt()是非静态函数,作用目标是“线程实例”,一般用法如下,
Java代码
- TestInterrupt t = new TestInterrupt();
- t.start();
- System.out.println(t.isInterrupt());
-
而Thread.interrupted()是静态函数,作用目标是“当前线程”
Java代码
- System.out.println(Thread.interrupted());
并且它会把当前线程的interrupt状态“复位”,假设当前线程的isInterrupt状态为true,它会返回true,但过后 isInterrupt的状态会复位为false。之后调用(Thread)t.isInterrupt或Thread.interrupted都会返回 false
2. interrupt()被调用后有几个可能,下面挑几种常见的归类一下:
线程阻塞的情况下:
- 如果线程在调用
Object
类的wait()
、wait(long)
或wait(long, int)
方法,或者该类的join()
、join(long)
、join(long, int)
、sleep(long)
或sleep(long, int)
方法过程中受阻,则其isInterrupt状态将被清除,设成false, 它还将收到一个InterruptedException.
Java代码
- public void run() {
- while (!Thread.currentThread().isInterrupted()) {
- try{
- Thread.sleep(1000);
- } catch (InterruptedException ie){
- ie.printStackTrace();
- }
- }
- }
如上所示,如果线程运行到Thread.sleep(1000)时,被其他线调用了该线程的interrupt()的方法,它将会进入catch的段落里面,然后再运行while (!Thread.currentThread().isInterrupted()) 时退出run, 线程被销毁。
- 如果该线程在可中断的通道上的 I/O 操作中受阻,则该通道将被关闭,该线程的isInterrupt状态将被设置成true, 并且该线程将收到一个
ClosedByInterruptException
。
线程正常运行的情况下:
- 该线程不受影响,继续运行,但该线程的isInterrupt状态将被设置成true
Java代码
- public void run() {
- while (!Thread.currentThread().isInterrupted()) {
- try{
- //A: 无阻塞的代码.......
- ......
- //B: 被调用interrupt.......
- ......
- //C: 无阻塞的代码.......
- } catch (InterruptedException ie){
- ie.printStackTrace();
- }
- }
- }
如上所示, 当线程正常运行时,在运行到B点时被调用了interrupt(), 此时该线程将继续正常运行,但isInterrupt的状态会被设为true,当做完 A,B,C的代码时,再进入while (!Thread.currentThread().isInterrupted()) 时,该线程被销毁。假如while的检查条件改为(true),该线程不会受影响,将会一直运行下去
相关推荐
java 线程中的 interrupt,isInterrupt,interrupted 方法详解 在 Java 中,线程(Thread)类提供了三个相关的方法:interrupt、isInterrupted 和 interrupted,这三个方法都是用于处理线程的中断状态的。下面我们将...
总的来说,Java的中断机制提供了一种安全且灵活的方式来停止线程,通过结合使用`interrupt()`, `isInterrupted()`, 和 `interrupted()`方法,以及妥善处理`InterruptedException`,可以确保线程在适当的时候优雅地...
在Java多线程编程中,理解`Thread`类中的`interrupt()`、`interrupted()`和`isInterrupted()`方法至关重要,因为它们与线程中断机制紧密相关。线程中断是Java提供的一种协作式中断机制,它并不强制结束线程,而是...
Java线程Thread之interrupt中断解析 Java线程Thread之interrupt中断机制是Java多线程编程中的一种重要机制。通过调用Thread.interrupt()方法,可以设置线程的中断状态位,线程会不时地检测这个中断标示位,以判断...
在Java编程语言中,`interrupt()` 和 `sleep()` 是两个非常关键的方法,它们与线程的控制和管理密切相关。理解这两个方法的工作原理是构建多线程应用程序的基础。 首先,我们来探讨 `interrupt()` 方法。在Java中,...
本资源“Java Thread Programming (Sams)”提供了详细的线程编程知识,结合了理论与实际代码,旨在帮助开发者深入理解并熟练掌握Java线程。 1. **线程概念** - 线程是操作系统调度的基本单位,一个进程可以包含多...
Java的`interrupt()`方法在多线程编程中扮演着重要的角色,它允许程序员通知一个线程,它的执行应该被中断。然而,理解`interrupt()`方法的正确使用方式至关重要,因为直接调用`interrupt()`并不总是能立即停止线程...
Thread.interrupt()方法的使用以及使用它退出线程
提供的两个压缩包文件,`Java Thread Programming (Sams).chm`和`Java Thread Programming (Source).rar`可能包含详细的章节内容和源代码示例,这对于实践和深入理解书中所讲的知识非常有帮助。记得结合实际编程练习...
- Thread.getThreadGroup()获取线程所属的线程组,Thread.interrupt()和Thread.currentThread().interrupted()分别用于中断和检查当前线程是否被中断。 10. **线程的等待/通知机制** - 使用wait()、notify()、...
#### 一、关于本教程 本教程主要介绍Java线程的基础知识,包括线程的概念、为什么线程有用以及如何开始编写简单的多线程程序。此外,还将探讨更复杂的线程应用程序的基本构建块,如线程间的数据交换、线程控制及...
以上就是关于“Java线程”的基本知识点,理解并熟练掌握这些内容对于编写高效、安全的并发程序至关重要。同时,理解JVM对线程的调度以及线程安全问题的处理也是提升Java并发编程能力的关键。在实际开发中,应结合...
`Thread`类在`java.lang`包中定义,提供了一系列与线程生命周期管理相关的功能,如`start()`, `join()`, `interrupt()`等。 #### 优缺点 - **优点**:继承`Thread`类可以直接调用`Thread`类的其他方法,如设置线程...
在Java中,线程中断主要通过`Thread.interrupt()`方法实现,这个方法会设置线程的中断状态标志。下面将详细阐述Java线程中断机制的各个方面。 1. **线程中断状态** Java中的线程中断状态是一种标志,由`Thread....
`javathread.part03.rar`这个压缩包文件很可能包含了关于Java线程深入理解和实践的资源,可能是代码示例、教程文档或者课件。在这个部分,我们将探讨Java线程的一些关键知识点。 1. **线程创建**: Java提供了两种...
`javathread.part05.rar`这个压缩包很可能包含了一组关于Java线程进阶教程或实例代码,这部分内容可能涵盖了Java线程的高级特性和实战应用。 Java线程允许程序同时执行多个任务,提高了程序的并发性。在Java中,...
本资源“MultiThread_java.rar”显然是一个关于Java多线程的资料包,包含了一个文本文件“www.pudn.com.txt”和可能是一个Java源代码文件“MultiThread_java”。下面我们将深入探讨Java多线程相关的知识点。 1. **...
- 线程可以通过`interrupt()`方法请求中断,而线程内的代码应检查并适当地响应`InterruptedException`。 9. **线程池**: - 使用`ExecutorService`和`ThreadPoolExecutor`管理线程池可以更高效地控制线程的生命...
Java推荐使用更安全的中断机制,即通过`Thread.interrupt()`方法向线程发送中断信号,然后在线程的run方法中定期检查`isInterrupted()`或`interrupted()`状态来优雅地停止线程。这种方式允许线程清理资源并正常退出...