`
小嘴冰凉
  • 浏览: 456922 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

多线程编程 实战篇 (四)

    博客分类:
  • j2se
阅读更多
[线程的中断]

不客气地说,至少有一半人认为,线程的"中断"就是让线程停止.
如果你也这么认为,那你对多线程编程还没有入门.

在java中,线程的中断(interrupt)只是改变了线程的中断状态,至于这个中断状态改变后
带来的结果,那是无法确定的,有时它更是让停止中的线程继续执行的唯一手段.不但不是
让线程停止运行,反而是继续执行线程的手段.


对于执行一般逻辑的线程,如果调用调用它的interrupt()方法,那么对这个线程没有任何
影响,比如线程a正在执行:
    while(条件) x ++;
这样的语句,如果其它线程调用a.interrupt();那么并不会影响a对象上运行的线程,如果
在其它线程里测试a的中断状态它已经改变,但并不会停止这个线程的运行.

在一个线程对象上调用interrupt()方法,真正有影响的是wait,join,sleep方法,当然这三个
方法包括它们的重载方法.

请注意:[上面这三个方法都会抛出InterruptedException],记住这句话,下面我会重复.
一个线程在调用interrupt()后,自己不会抛出InterruptedException异常,所以你看到
interrupt()并没有抛出这个异常,所以我上面说如果线程a正在执行while(条件) x ++;
你调用a.interrupt();后线程会继续正常地执行下去.

但是,如果一个线程被调用了interrupt()后,它的状态是已中断的.这个状态对于正在执行
wait,join,sleep的线程,却改变了线程的运行结果.

    一.对于wait中等待notify/notifyAll唤醒的线程,其实这个线程已经"暂停"执行,因为
它正在某一对象的休息室中,这时如果它的中断状态被改变,那么它就会抛出异常.
这个InterruptedException异常不是线程抛出的,而是wait方法,也就是对象的wait方法内部
会不断检查在此对象上休息的线程的状态,如果发现哪个线程的状态被置为已中断,则会抛出
InterruptedException,意思就是这个线程不能再等待了,其意义就等同于唤醒它了.

    这里唯一的区别是,被notify/All唤醒的线程会继续执行wait下面的语句,而在wait
中被中断的线程则将控制权交给了catch语句.一些正常的逻辑要被放到catch中来运行.
    但有时这是唯一手段,比如一个线程a在某一对象b的wait中等待唤醒,其它线程必须
获取到对象b的监视锁才能调用b.notify()[All],否则你就无法唤醒线程a,但在任何线程中可
以无条件地调用a.interrupt();来达到这个目的.只是唤醒后的逻辑你要放在catch中,当然同
notify/All一样,继续执行a线程的条件还是要等拿到b对象的监视锁.

    二.对于sleep中的线程,如果你调用了Thread.sleep(一年);现在你后悔了,想让它早
些醒过来,调用interrupt()方法就是唯一手段,只有改变它的中断状态,让它从sleep中将控制
权转到处理异常的catch语句中,然后再由catch中的处理转换到正常的逻辑.同样,地于join中
的线程你也可以这样处理.
   

    对于一般介绍多线程模式的书上,他们会这样来介绍:当一个线程被中断后,在进入
wait,sleep,join方法时会抛出异常.
    是的,这一点也没有错,但是这有什么意义呢?如果你知道那个线程的状态已经处于中
断状态,为什么还要让它进入这三个方法呢?当然有时是必须这么做的,但大多数时候没有这么
做的理由,所以我上面主要介绍了在已经调用这三个方法的线程上调用interrupt()方法让它中
这本个方法的"暂停"状态中恢复过来.这个恢复过来就可以包含两个目的:
    一.[可以使线程继续执行],那就是在catch语句中招待醒来后的逻辑,或由catch语句
转回正常的逻辑.总之它是从wait,sleep,join的暂停状态活过来了.
    二.[可以直接停止线程的运行],当然在catch中什么也不处理,或return,那么就完成
了当前线程的使命,可以使在上面"暂停"的状态中立即真正的"停止"

http://blog.csdn.net/axman/archive/2005/12/26/562249.aspx
分享到:
评论

相关推荐

    Java多线程编程实战指南(核心篇)

    Java多线程编程实战指南(核心篇) 高清pdf带目录 随着现代处理器的生产工艺从提升处理器主频频率转向多核化,即在一块芯片上集成多个处理器内核(Core),多核处理器(Multicore Processor)离我们越来越近了――如今...

    Java多线程编程实战指南-核心篇

    《Java多线程编程实战指南-核心篇》是一本深入探讨Java并发编程的书籍,旨在帮助读者掌握在Java环境中创建、管理和同步线程的核心技术。Java的多线程能力是其强大之处,使得开发者能够在同一时间执行多个任务,提高...

    java 多线程编程实战指南(核心 + 设计模式 完整版)

    《Java多线程编程实战指南》这本书深入浅出地讲解了Java多线程的核心概念和实战技巧,分为核心篇和设计模式篇,旨在帮助开发者掌握并应用多线程技术。 1. **线程基础** - **线程的创建**:Java提供了两种创建线程...

    C#多线程编程实战.pdf

    C#多线程编程实战.pdf

    汪文君JAVA多线程编程实战(完整不加密)

    《汪文君JAVA多线程编程实战》是一本专注于Java多线程编程的实战教程,由知名讲师汪文君倾力打造。这本书旨在帮助Java开发者深入理解和熟练掌握多线程编程技术,提升软件开发的效率和质量。在Java平台中,多线程是...

    C#多线程编程实例实战.pdf

    C#多线程编程实例实战 C#多线程编程实例实战是指在C#语言中实现多线程编程的实例和实战经验。多线程编程是指在同一个进程中创建多个线程,以便提高程序的执行效率和响应速度。在C#语言中,可以使用Thread类和线程池...

    C++多线程编程实战

    C++多线程 windows

    c#多线程编程实战(原书第二版)源码

    《C#多线程编程实战(原书第二版)源码》是一本深入探讨C#中多线程技术的专业书籍,其源码提供了丰富的实践示例,帮助读者掌握并发编程的核心概念和技术。在C#中,多线程是实现高性能、响应式应用程序的关键组成部分...

    C#多线程编程实战完整源码

    本资源"《C#多线程编程实战》完整源码"提供了丰富的实例,适用于学习和实践C#中的多线程概念。 在C#中,多线程允许应用程序同时执行多个独立的任务,提高系统利用率并优化性能。.NET框架为开发者提供了强大的支持,...

    《C#多线程编程实战》.((美)Eugene Agafonov).[PDF]

    《C#多线程编程实战》.((美)Eugene Agafonov).[PDF]《C#多线程编程实战》.((美)Eugene Agafonov).[PDF]《C#多线程编程实战》.((美)Eugene Agafonov).[PDF]

    多线程编程实战指南-核心篇

    《多线程编程实战指南-核心篇》是针对Java开发者深入理解并掌握多线程编程的一本实战性书籍。在当今的并发计算环境中,多线程技术是必不可少的知识点,它能够有效地利用多核处理器资源,提高程序的执行效率。本书以...

    【免费2018】C#多线程编程实战_中文完整版(带书签目录)【PDF高清】.rar

    《C#多线程编程实战》是一本专为C#开发者设计的深度学习多线程技术的书籍。这本书全面覆盖了C#中的并发和多线程编程,旨在帮助读者掌握如何在多核处理器环境下有效利用系统资源,提高程序的执行效率和响应速度。 在...

    多线程编程——实战篇

    ### 多线程编程实战篇知识点详解 #### 一、多线程编程的基本原则 多线程编程在软件开发中占据着重要的地位,特别是在需要高效利用计算机资源的应用场景下。多线程编程的核心在于如何有效地管理和协调多个线程之间...

    java多线程编程实战指南 核心篇 代码

    《Java多线程编程实战指南(核心篇)》以基本概念、原理与方法为主线,辅以丰富的实战案例和生活化实例,并从Java虚拟机、操作系统和硬件多个层次与角度出发,循序渐进、系统地介绍Java平台下的多线程编程核心技术及...

    C++多线程编程实战 _C++_线程进程_thread_

    P303.zip

    C#多线程编程实战 源代码

    本书是一本通俗易懂的C#多线程编程指南,通过70多个容易理解的示例,循序渐进地讲解C#5.0中的异步及并发编程,引导读者了解Windows下C#多线程编程的多样性。 通过阅读本书,你将学到: 使用原始线程、异步线程,...

    C++ 多线程编程实战

    高清文档,希望对C++学习者有用

    C#多线程编程实战源码

    本资源"《C#多线程编程实战源码》"提供了丰富的实例,帮助开发者深入理解和实践C#中的多线程技术。 1. **线程基础**:线程是操作系统分配CPU时间的基本单元,一个进程可以有多个线程,每个线程执行不同的任务。在C#...

    Java多线程编程实战指南(设计模式篇)

    《Java多线程编程实战指南(设计模式篇)》由黄文海撰写,是一本深入探讨Java多线程编程和设计模式的专业书籍。书中详细介绍了如何在Java环境中利用多线程来实现高效的并发处理,同时结合设计模式,帮助开发者更好地...

    C++多线程编程实战 姜佑译

    C++多线程编程实战 姜佑译

Global site tag (gtag.js) - Google Analytics