`
h416756139
  • 浏览: 365657 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

    博客分类:
  • java
阅读更多

在java的线程Thread类中有三个方法,比较容易混淆,在这里解释一下
(1)interrupt:置线程的中断状态
(2)isInterrupt:线程是否中断
(3)interrupted:返回线程的上次的中断状态,并清除中断状态

举个例子:

class MyThread extends Thread {  

    ......  

    ......  

    public void run() {  

        try {  

            while(!Thread.currentThread().isInterrupted()) {  

                //当达到队列容量时,在这里会阻塞  

                //put的内部会调用LockSupport.park()这个是用来阻塞线程的方法  

                //当其他线程,调用此线程的interrupt()方法时,会设置一个中断标志  

                //LockSupport.part()中检测到这个中断标志,会抛出InterruptedException,并清除线程的中断标志  

                //因此在异常段调用Thread.currentThread().isInterrupted()返回为false  

                ArrayBlockingQueue.put(somevalue);   

            }  

        } catch (InterruptedException e) {  

            //由于阻塞库函数,如:Object.wait,Thread.sleep除了抛出异常外,还会清除线程中断状态,因此可能在这里要保留线程的中断状态  

            Thread.currentThread().interrupt();  

        }  

    }  

    public void cancel() {  

        interrupt();  

    }  

}  

外部调用  

MyThread thread = new MyThread();  

thread.start();  

......  

thread.cancel();  

thread.isInterrupted();  

 

一般来说,阻塞函数,如:Thread.sleep、Thread.join、Object.wait、LockSupport.park等在检查到线程的中断状态时,会抛出InterruptedException,同时会清除线程的中断状态

对于InterruptedException的处理,可以有两种情况:
(1)外层代码可以处理这个异常,直接抛出这个异常即可
(2)如果不能抛出这个异常,比如在run()方法内,因为在得到这个异常的同时,线程的中断状态已经被清除了,需要保留线程的中断状态,则需要调用Thread.currentThread().interrupt()

另外,Thread.interrupted()在jdk库的源代码中比较常用,因为它既可以得到上一次线程的中断标志值,又可以同时清除线程的中断标志,一举两得,但同时也有坏处,就是这个函数有清除中断状态的副作用,不容易理解.转自:
http://blog.csdn.net/gtuu0123/archive/2010/11/27/6040105.aspx

 

分享到:
评论
2 楼 郭建雄 2014-08-02  
不错,受用了,谢谢你的分享 !
1 楼 lxtkong-029 2012-02-21  
原来一直不是很清楚,看来你的文章明白了,太感谢了!

相关推荐

    Java线程(第三版)

    此外,书中可能讨论了线程池的概念,比如`ExecutorService`, `ThreadPoolExecutor`和`Executors`工厂方法,它们是Java中管理和控制线程的有效手段,可以提高性能并减少资源消耗。线程池允许设置线程数量、队列大小...

    java线程实例 各种小Demo

    在Java中,线程可以分为用户线程和守护线程,前者是程序运行的基础,而后者是在所有用户线程结束时才终止的后台服务。 一、线程的创建方式 Java提供了多种创建线程的方式: 1. 继承Thread类:创建一个新的类,继承...

    java多线程Demo

    在Java中,实现多线程有两种主要方式:继承Thread类和实现Runnable接口。 1. 继承Thread类: 当我们创建一个新的类,让它继承Thread类时,可以通过重写`run()`方法来定义线程执行的任务。然后创建该类的对象,并...

    java线程中断之interrupt和stop.docx

    通过对`interrupt`和`stop`方法的学习,我们可以更好地控制Java中的线程行为。`interrupt`方法是一种更安全的方式,它通过改变线程的状态来中断线程,而不会直接结束线程的生命。相比之下,`stop`方法虽然可以直接...

    java线程与并发编程实践

    线程的生命周期包括新建、就绪、运行、阻塞和终止五种状态,Java API提供了start()、sleep()、join()、yield()、interrupt()等方法来控制线程状态。 并发编程的核心挑战在于线程间的同步与通信。Java提供了一系列...

    Java线程.ppt

    Java中,线程是通过`java.lang.Thread`类实现的。每个线程都是通过特定`Thread`对象的`run()`方法执行其操作。如果你想创建一个新的线程,你可以选择以下两种方式: 1. 继承`Thread`类并重写`run()`方法。 2. 实现`...

    JAVA线程学习(源代码)

    在Java中,线程间的通信可以通过wait()、notify()和notifyAll()方法实现,这些方法需要在synchronized代码块或方法中调用,以确保线程安全。另外,`java.util.concurrent`包中的BlockingQueue是一个高效的线程间通信...

    java线程.rar

    9. **线程中断**:通过`interrupt()`方法设置线程的中断标志,线程可以通过检查`isInterrupted()`或`interrupted()`方法来响应中断请求。 10. **线程Local变量**:`ThreadLocal`类为每个线程提供独立的变量副本,...

    JAVA线程停止的方法

    在Java中,直接调用线程的`stop()`方法来终止线程已被废弃,因为这可能导致资源泄露、数据不一致等问题。取而代之的是,开发者通常采用以下几种策略: 1. **使用标志变量(Flag)** 2. **中断线程(Interrupt)** 3...

    java多线程的讲解和实战

    9. **线程中断**:`interrupt()`方法可以标记线程中断状态,线程可以通过检查`isInterrupted()`或`interrupted()`方法来响应中断请求,从而优雅地停止线程执行。 10. **线程局部变量(ThreadLocal)**:为每个线程...

    JAVA 线程中启动线程

    本篇文章将详细探讨如何在Java中启动线程,以及相关的重要概念和技术。 1. **线程创建方式** - **实现Runnable接口**:这是最常见的创建线程的方式,只需创建一个类实现`Runnable`接口,然后在`run()`方法中编写...

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

    在Java中,interrupt机制的实现主要通过三个方法来实现: 1. Thread.interrupt():设置当前中断标记为true,类似属性的set方法。 2. Thread.isInterrupted():检测当前的中断标记,类似属性的get方法。 3. Thread....

    电子书《java线程》

    在Java中,线程是程序执行的独立路径,它们可以同时运行,使程序能够处理多个任务。Java提供了一个丰富的线程API,包括Thread类和Runnable接口,使得开发者能够创建、控制和管理线程。线程的生命周期包括新建、就绪...

    Java多线程笔记

    在 Java 中,线程中断是通过 interrupt 方法来实现的,该方法只是给线程置一个中断标志位,并不会立即停止线程的运行。interrupted 方法可以判断是否被中断,静态方法 interrupted() 则可以判断是否被中断,并清除...

    Java线程学习和总结

    Java提供了一些方法来控制线程状态,如`sleep()`使线程暂停执行一段时间,`join()`等待指定线程结束,`yield()`让当前线程暂停,让其他相同优先级的线程有机会执行,`interrupt()`用于中断线程。 同步是Java线程...

    java线程实战手册

    《Java线程实战手册》是Java并发编程领域的一份重要参考资料,主要针对Java开发者,旨在帮助他们深入理解和熟练掌握Java中的多线程技术。虽然这里只提供了第一章的内容,但这一章通常会涵盖基础理论和核心概念,对于...

    Java多线程机制(讲述java里面与多线程有关的函数)

    9.1 Java中的线程: Java程序中的线程是在操作系统级别的线程基础上进行抽象的。每个Java程序都有一个主线程,即由JVM启动并执行main方法的线程。线程代表了程序中的执行流,可以在不同的线程之间切换以共享CPU时间...

    简单的java线程demo

    本示例"简单的Java线程demo"旨在帮助初学者理解如何在Java中创建和管理线程。 在Java中,有两种主要的方式来创建线程:继承Thread类和实现Runnable接口。下面我们将详细讨论这两个方法。 1. 继承Thread类: 当一个...

    java线程入门

    在Java中,线程可以分为两种类型:用户线程(由应用程序创建)和守护线程(如垃圾收集器,用于支持用户线程的后台服务)。 1. **线程的创建** - **通过实现Runnable接口**:创建一个类实现Runnable接口,并重写run...

Global site tag (gtag.js) - Google Analytics