`
nanjingjiangbiao_T
  • 浏览: 2600192 次
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

java中断和线程结束深入探讨

 
阅读更多
中断:
有软中断和硬中断之分。而硬中断多为外围设备引起而且发生多是随机的,故我们在这里只讨论java程序中的软中断,是可控的。

这里我必须要回答几个问题,然而是网上大多数文章没有回答的。
a)为什么使用中断?
b)何时使用中断?
c)中断和结束线程之间有什么关系?
d)中断是否就是结束线程?

a)在java中我们引入中断的目的是为了打断线程现在所处的某种状态,但是我们知道这种状态一定是阻塞状态;
b)上面已经说了是在线程阻塞的时候,我们想要改变它阻塞的状态,所以通常在线程sleep,wait,join的情况下我们可以使用中断;
c)由于中断可以捕获,通过这种方式我们可以结束线程;
d)中断不是结束线程,只不过发送了一个中断信号而已,线程要退出还要我们加上自己的结束线程的操作。

上面说了中断使用的情况也就是scope,那么也就说明了线程在某些情况是不可中断的,换句话说,是捕获不到中断信号的。

我们现在将中断分为两种情况:
可中断的阻塞和不可中断的阻塞

对于可中断的阻塞情况我们要怎么结束这样的线程呢?下面举个简单的例子;

public void run() {   
    while (!Thread.currentThread().isInterrupted()&& more work to do) {   
        try {   
            ...   
            sleep(delay);   
        } catch (InterruptedException e) {   
           Thread.currentThread().interrupt();//重新设置中断标示   
        }   
    }   
}   

public void run() { 
    while (!Thread.currentThread().isInterrupted()&& more work to do) { 
        try { 
            ... 
            sleep(delay); 
        } catch (InterruptedException e) { 
            Thread.currentThread().interrupt();//重新设置中断标示 
        } 
    } 
} 

通过在另外一个线程或者主线程里面调用要结束或者中断线程的句柄执行interrupt()方法,然后在该线程里面去捕获中断,从而退出run()方法;当然上面也可以用bool值的方式,在捕获到中断后修改bool值达到退出run方法的目的。上面的例子都是用于wait,join的情况。

谈到不可中断的阻塞,由于线程阻塞不可能被中断,或者不具备被中断的条件,所以我们会考虑到一些不同的处理方式:
一是引入条件可以让该不可中断的线程能够被中断,比如在read的循环里面加个sleep函数,这样就可以捕获中断异常从而达到退出的目的了;
二是我们还是可以引入一个valotile的bool值的方式,线程要结束时,在循环里面去修改,注意这里有一个前提是有一个循环,并且循环执行一次的时间很短;
三是书上和网上将的情况,socket的处理是用关闭socket的方式也就是关闭底层资源的方式来捕获异常达到退出的目的;

四也是网上和书上讲到的对被加锁的块(synchronized方法和临界区)进行中断采用ReentrantLock可以捕获中断。


分享到:
评论

相关推荐

    JAVA多线程编程技术探讨.pdf

    JAVA多线程编程技术探讨,深入JAVA多线程编程技术的基础

    Java的线程和Java AppletJava的线程和Java AppletJava的线程和Java Applet

    Java的线程和Java AppletJava的线程和Java AppletJava的线程和Java AppletJava的线程和Java AppletJava的线程和Java Applet

    深入浅出 Java 多线程.pdf

    深入浅出 Java 多线程.pdf

    Java 模拟线程并发

    Java 模拟线程并发 Java, 模拟线程并发,线程,并发 Java, 模拟线程并发,线程,并发 Java, 模拟线程并发,线程,并发 Java, 模拟线程并发,线程,并发

    Java线程Java线程Java线程Java线程

    Java线程Java线程Java线程Java线程Java线程Java线程

    JAVA多线程探讨 (2).pptx

    JAVA多线程探讨 (2).pptxJAVA多线程探讨 (2).pptxJAVA多线程探讨 (2).pptxJAVA多线程探讨 (2).pptx

    java多线程编程总结

    Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-优先级 ...

    java线程深入解析

    java线程深入讲解,可以了解java线程同步语安全,实现的方法和synchronized锁的使用与安全控制等等,谁用谁知道好用

    线程 JAVA java线程 java线程第3版 java线程第2版第3版合集

    电子书相关:包含4个有关JAVA线程的电子书(几乎涵盖全部有关线程的书籍) OReilly.Java.Threads.3rd.Edition.Sep.2004.eBook-DDU Java Thread Programming (Sams) java线程第二版中英文 java线程第二版中英文 ...

    Java多线程编程总结

    Java 线程系列博文总结word化,编目如下,欢迎互相学习交流: Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:...

    Java线程讲解Java线程讲解

    Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解

    java 线程java 线程

    java 线程java 线程java 线程java 线程java 线程java 线程java 线程java 线程java 线程

    java多线程笔记

    Java线程:概念与原理 2 一、操作系统中线程和进程的概念 2 二、Java中的线程 3 三、Java中关于线程的名词解释 3 四、线程的状态转换和生命周期 4 Java线程:创建与启动 7 Java线程:线程名称的设定及获取 10 Java...

    深入浅出Java多线程.pdf

    深入浅出Java多线程.pdf

    深入浅出Java多线程.doc

    深入浅出Java多线程.doc深入浅出Java多线程.doc深入浅出Java多线程.doc

    Java线程详解大全

    Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程

    JAVA单线程多线程

    单线程 单线程 单线程 单线程 单线程 单线程

    JAVA线程深入了解

    对JAVA线程里方法深层次的讲述,帮助大家更加轻松的写多线程程序

    Java多线程设计模式上传文件

    Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式...

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

    Java多线程机制 9.1 Java中的线程 9.2 Thread的子类创建线程 9.3 使用Runable接口 9.4 线程的常用方法 9.5 GUI线程 9.6 线程同步 9.7 在同步方法中使用wait()、notify 和notifyAll()方法 9.8 挂起、恢复和终止线程 ...

Global site tag (gtag.js) - Google Analytics