`
jay_kid
  • 浏览: 65049 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

关于Java thread的Interrupt, isInterrupt, interrupted

阅读更多

在《Java网络编程》上看到一个例子, 说是用thread.interrupt()去关闭在等待的线程。不太明白,于是去查了一下Java的API。

有兴趣的同行们可以先看看API的内容,再看以下总结:

 

1. thread.isInterrupt()和Thread.interrupted()都返回当前线程interrupt的状态

  • thread.isInterrupt()是非静态函数,作用目标是“线程实例”,一般用法如下,
TestInterrupt t = new TestInterrupt();
t.start();
System.out.println(t.isInterrupt());

 

  • 而Thread.interrupted()是静态函数,作用目标是“当前线程”
System.out.println(Thread.interrupted());

 并且它会把当前线程的interrupt状态“复位”,假设当前线程的isInterrupt状态为true,它会返回true,但过后isInterrupt的状态会复位为false。之后调用(Thread)t.isInterrupt或Thread.interrupted都会返回false

 

 

2. interrupt()被调用后有几个可能,下面挑几种常见的归类一下:

 

线程阻塞的情况下:

	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, 线程被销毁。

 

 

 

线程正常运行的情况下:

  •  该线程不受影响,继续运行,但该线程的isInterrupt状态将被设置成true
	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),该线程不会受影响,将会一直运行下去。

 

 

 

先写到这里,欢迎大家留言,如果有说得不对的地方,一起讨论 ^________^

3
1
分享到:
评论
8 楼 real_yqdt 2015-09-08  
                                 
7 楼 二当家的 2015-08-30  
while需要写在try里面
6 楼 sampras87 2014-08-18  
mojunbin 写道
public void run() {  
  
    while (!Thread.currentThread().isInterrupted()) {  
        try{  
            Thread.sleep(1000);  
        } catch (InterruptedException ie){  
            ie.printStackTrace();  
        }  
    }  
} 


这段代码确实会无限循环..

假设有两个线程:t1:代表run()方法所在线程;main:代表主线程.

对于一个新生线程,其中断状态位为"false".

当t1睡眠时,main线程调用t1.interrupt(),t1的中断状态位变成"true",t1脱离阻塞状态,并抛出InterruptedException异常,同时重置中断状态位为"false".

之后Thread.currentThread().isInterrupted()仍然返回false,因此循环无法退出.


这个try语句的确应该把while也try住,才能如预期的运行。

5 楼 boaixiaohai 2014-08-11  
mojunbin 写道
public void run() {  
  
    while (!Thread.currentThread().isInterrupted()) {  
        try{  
            Thread.sleep(1000);  
        } catch (InterruptedException ie){  
            ie.printStackTrace();  
        }  
    }  
} 


这段代码确实会无限循环..

假设有两个线程:t1:代表run()方法所在线程;main:代表主线程.

对于一个新生线程,其中断状态位为"false".

当t1睡眠时,main线程调用t1.interrupt(),t1的中断状态位变成"true",t1脱离阻塞状态,并抛出InterruptedException异常,同时重置中断状态位为"false".

之后Thread.currentThread().isInterrupted()仍然返回false,因此循环无法退出.


也不是肯定死循环,要看运气,不过这段代码确实不能用.
4 楼 cnlinkin 2012-06-07  
public void run() {  
  
    while (!Thread.currentThread().isInterrupted()) {  
        try{  
            Thread.sleep(1000);  
        } catch (InterruptedException ie){  
            System.out.printf("%s caught interrupt signal...", this);
            Thread.currentThread().interrupt();   
        }  
    }
   System.out.printf("thread %s done...", this);  
} 

3 楼 mojunbin 2012-04-21  
public void run() {  
  
    while (!Thread.currentThread().isInterrupted()) {  
        try{  
            Thread.sleep(1000);  
        } catch (InterruptedException ie){  
            ie.printStackTrace();  
        }  
    }  
} 


这段代码确实会无限循环..

假设有两个线程:t1:代表run()方法所在线程;main:代表主线程.

对于一个新生线程,其中断状态位为"false".

当t1睡眠时,main线程调用t1.interrupt(),t1的中断状态位变成"true",t1脱离阻塞状态,并抛出InterruptedException异常,同时重置中断状态位为"false".

之后Thread.currentThread().isInterrupted()仍然返回false,因此循环无法退出.
2 楼 habzyhs 2011-09-05  
乱讲。 你去实践下,写个代码。再敲好不?
1 楼 jackybobo 2011-03-10  


	public void run() {

		while (!Thread.currentThread().isInterrupted()) {
			try{
				Thread.sleep(1000);
			} catch (InterruptedException ie){
				ie.printStackTrace();
			}
		}
	}



这个不会退出吧??

相关推荐

    java线程中的interrupt,isInterrupt,interrupted方法

    java 线程中的 interrupt,isInterrupt,interrupted 方法详解 在 Java 中,线程(Thread)类提供了三个相关的方法:interrupt、isInterrupted 和 interrupted,这三个方法都是用于处理线程的中断状态的。下面我们将...

    Java中interrupt的使用.docx

    总的来说,Java的中断机制提供了一种安全且灵活的方式来停止线程,通过结合使用`interrupt()`, `isInterrupted()`, 和 `interrupted()`方法,以及妥善处理`InterruptedException`,可以确保线程在适当的时候优雅地...

    Thread类的interrupt(),interrupted(),isInterrupted()1

    在Java多线程编程中,理解`Thread`类中的`interrupt()`、`interrupted()`和`isInterrupted()`方法至关重要,因为它们与线程中断机制紧密相关。线程中断是Java提供的一种协作式中断机制,它并不强制结束线程,而是...

    浅谈Java线程Thread之interrupt中断解析

    Java线程Thread之interrupt中断解析 Java线程Thread之interrupt中断机制是Java多线程编程中的一种重要机制。通过调用Thread.interrupt()方法,可以设置线程的中断状态位,线程会不时地检测这个中断标示位,以判断...

    [Java基础]猜测Java的interrupt和sleep做了什么

    在Java编程语言中,`interrupt()` 和 `sleep()` 是两个非常关键的方法,它们与线程的控制和管理密切相关。理解这两个方法的工作原理是构建多线程应用程序的基础。 首先,我们来探讨 `interrupt()` 方法。在Java中,...

    Java Thread Programming (Sams) java线程编程(含code)

    本资源“Java Thread Programming (Sams)”提供了详细的线程编程知识,结合了理论与实际代码,旨在帮助开发者深入理解并熟练掌握Java线程。 1. **线程概念** - 线程是操作系统调度的基本单位,一个进程可以包含多...

    Java interrupt()方法使用注意_动力节点Java学院整理

    Java的`interrupt()`方法在多线程编程中扮演着重要的角色,它允许程序员通知一个线程,它的执行应该被中断。然而,理解`interrupt()`方法的正确使用方式至关重要,因为直接调用`interrupt()`并不总是能立即停止线程...

    Thread.interrupt()方法的使用以及使用它退出线程

    Thread.interrupt()方法的使用以及使用它退出线程

    Java Thread Programming

    提供的两个压缩包文件,`Java Thread Programming (Sams).chm`和`Java Thread Programming (Source).rar`可能包含详细的章节内容和源代码示例,这对于实践和深入理解书中所讲的知识非常有帮助。记得结合实际编程练习...

    JavaThread.pdf

    - Thread.getThreadGroup()获取线程所属的线程组,Thread.interrupt()和Thread.currentThread().interrupted()分别用于中断和检查当前线程是否被中断。 10. **线程的等待/通知机制** - 使用wait()、notify()、...

    java thread的教程

    #### 一、关于本教程 本教程主要介绍Java线程的基础知识,包括线程的概念、为什么线程有用以及如何开始编写简单的多线程程序。此外,还将探讨更复杂的线程应用程序的基本构建块,如线程间的数据交换、线程控制及...

    java Thread

    以上就是关于“Java线程”的基本知识点,理解并熟练掌握这些内容对于编写高效、安全的并发程序至关重要。同时,理解JVM对线程的调度以及线程安全问题的处理也是提升Java并发编程能力的关键。在实际开发中,应结合...

    Java中Runnable和Thread的区别

    `Thread`类在`java.lang`包中定义,提供了一系列与线程生命周期管理相关的功能,如`start()`, `join()`, `interrupt()`等。 #### 优缺点 - **优点**:继承`Thread`类可以直接调用`Thread`类的其他方法,如设置线程...

    JavaThread中断机制共11页.pdf.zip

    在Java中,线程中断主要通过`Thread.interrupt()`方法实现,这个方法会设置线程的中断状态标志。下面将详细阐述Java线程中断机制的各个方面。 1. **线程中断状态** Java中的线程中断状态是一种标志,由`Thread....

    javathread.part03.rar

    `javathread.part03.rar`这个压缩包文件很可能包含了关于Java线程深入理解和实践的资源,可能是代码示例、教程文档或者课件。在这个部分,我们将探讨Java线程的一些关键知识点。 1. **线程创建**: Java提供了两种...

    javathread.part05.rar

    `javathread.part05.rar`这个压缩包很可能包含了一组关于Java线程进阶教程或实例代码,这部分内容可能涵盖了Java线程的高级特性和实战应用。 Java线程允许程序同时执行多个任务,提高了程序的并发性。在Java中,...

    MultiThread_java.rar_java thread_java并行_multithread_任务

    本资源“MultiThread_java.rar”显然是一个关于Java多线程的资料包,包含了一个文本文件“www.pudn.com.txt”和可能是一个Java源代码文件“MultiThread_java”。下面我们将深入探讨Java多线程相关的知识点。 1. **...

    Java_Thread应该注意的问题

    - 线程可以通过`interrupt()`方法请求中断,而线程内的代码应检查并适当地响应`InterruptedException`。 9. **线程池**: - 使用`ExecutorService`和`ThreadPoolExecutor`管理线程池可以更高效地控制线程的生命...

    java线程强制停止的两个Demo

    Java推荐使用更安全的中断机制,即通过`Thread.interrupt()`方法向线程发送中断信号,然后在线程的run方法中定期检查`isInterrupted()`或`interrupted()`状态来优雅地停止线程。这种方式允许线程清理资源并正常退出...

Global site tag (gtag.js) - Google Analytics