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

多线程编程 实践篇(五)注:转

阅读更多

中断线程

有了上一节[线程的中断],我们就好进行如何[中断线程]了.这绝对不是玩一个文字游戏.
是因为"线程的中断"并不能保证"中断线程",所以我要特别地分为两节来说明.

这里说的"中断线程"意思是"停止线程",而为什么不用"停止线程"这个说法呢?

因为线程有一个明确的stop方法,但它是反对使用的,所以请大家记住,在java中以后不要提
停止线程这个说法,忘记它!

 但是,作为介绍线程知识的我,我仍然要告诉你为什么不用"停止线程"的理由.

[停止线程]
 当在一个线程对象上调用stop()方法时,这个线程对象所运行的线程就会立即停止,
并抛出特殊的ThreadDeath()异常.这里的"立即"因为太"立即"了,就象一个正在摆弄自己的
玩具的孩子,听到大人说快去睡觉去,就放着满地的玩具立即睡觉去了.这样的孩子是不乖的.

假如一个线程正在执行:

synchronized void {
 x = 3;
 y = 4;
}
由于方法是同步的,多个线程访问时总能保证x,y被同时赋值,而如果一个线程正在执行到
x = 3;时,被调用了 stop()方法,即使在同步块中,它也干脆地stop了,这样就产生了不完整
的残废数据.而多线程编程中最最基础的条件要保证数据的完整性,所以请忘记线程的stop
方法,以后我们再也不要说"停止线程"了.

 如何才能"结束"一个线程?
[中断线程]
 结束一个线程,我们要分析线程的运行情况.也就是线程正在干什么.如果那个孩子
什么事也没干,那就让他立即去睡觉.而如果那个孩子正在摆弄他的玩具,我们就要让它把玩
具收拾好再睡觉.

 所以一个线程从运行到真正的结束,应该有三个阶段:

 1.正常运行.
 2.处理结束前的工作,也就是准备结束.
 3.结束退出.

 在我的JDBC专栏中我N次提醒在一个SQL逻辑结束后,无论如何要保证关闭Connnection
那就是在finally从句中进行.同样,线程在结束前的工作应该在finally中来保证线程退出前
一定执行:

 try{
  正在逻辑
 }catch(){}
 finally{
  清理工作
 }

那么如何让一个线程结束呢?既然不能调用stop,可用的只的interrupt()方法.但interrupt()
方法只是改变了线程的运行状态,如何让它退出运行?

 对于一般逻辑,只要线程状态为已经中断,我们就可以让它退出,所以这样的语句可以保证
线程在中断后就能结束运行:

 while(!isInterrupted()){
  正常逻辑
 }
 这样如果这个线程被调用interrupt()方法,isInterrupted()为true,就会退出运行.但是
如果线程正在执行wait,sleep,join方法,你调用interrupt()方法,这个逻辑就不完全了.

 如果一个有经验的程序员来处理线程的运行的结束:

 public void run(){
  try{
   while(!isInterrupted()){
    正常工作
   }
  }
  catch(Exception e){
   return;
  }
  finally{
   清理工作
  }
  
 }
我们看到,如果线程执行一般逻辑在调用innterrupt后.isInterrupted()为true,退出循环后执行
清理工作后结束,即使线程正在wait,sleep,join,也会抛出异常执行清理工作后退出.
这看起来非常好,线程完全按最我们设定的思路在工作.但是,并不是每个程序员都有这种认识,如果
他聪明的自己处理异常会如何?事实上很多或大多数程序员会这样处理:

 public void run(){
  
  while(!isInterrupted()){
   try{
    正常工作
   }catch(Exception e){
    //nothing
   }
   finally{
   
   }
  }
 } 

 想一想,如果一个正在sleep的线程,在调用interrupt后,会如何?
 wait方法检查到isInterrupted()为true,抛出异常,而你又没有处理.而一个抛出了
InterruptedException的线程的状态马上就会被置为非中断状态,如果catch语句没有处理异常,则
下一次循环中isInterrupted()为false,线程会继续执行,可能你N次抛出异常,也无法让线程停止.

 那么如何能确保线程真正停止?
 在线程同步的时候我们有一个叫"二次惰性检测"(double check),能在提高效率的基础上又
确保线程真正中同步控制中.
 那么我把线程正确退出的方法称为"双重安全退出",即不以isInterrupted()为循环条件.而
以一个标记作为循环条件:

class MyThread extend Thread{
 private boolean isInterrupted = false;//这一句以后要修改

 public void interrupt(){
  isInterrupted = true;
  super.interrupt();
 }
 public void run(){
  
  while(!isInterrupted){
   try{
    正常工作
   }catch(Exception e){
    //nothing
   }
   finally{
   
   }
  }
 }
}

试试这段程序,可以正确工作吗?
对于这段程序仍然还有很多可说的地方,先到这里吧.

分享到:
评论
1 楼 白色熊猫 2011-04-12  
这些资料丛哪里转来的啊 ?相当的不错 啊

相关推荐

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

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

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

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

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

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

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

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

    MFC多线程编程

    **五、MFC多线程编程实践** 在MFC中创建多线程,首先创建一个继承自CWinThread的类,然后重写InitInstance和Run方法。InitInstance通常用于线程初始化,Run则包含线程的主要工作。通过调用AfxBeginThread函数或者在...

    多线程编程指南_学习多线程编程的宝典

    1. 创建线程:使用`std::thread`构造函数传入一个可调用对象(函数、函数指针或lambda表达式)来创建新线程。 2. 同步与join:通过调用`std::thread::join()`函数等待线程结束,避免悬挂线程;`std::thread::detach...

    多线程编程基础.pdf

    ### 五、多线程编程的最佳实践 1. **最小化共享状态**:尽量减少线程间共享的数据,可以降低同步的复杂度。 2. **使用高级同步工具**:利用语言或库提供的高级同步原语,如Java的`volatile`关键字或C++的`std::...

    Linux系统下的多线程编程入门.pdf

    在Linux系统下进行多线程编程是开发高效并发应用程序的关键技术之一。本文将深入探讨Linux环境中的多线程概念、创建与管理线程的方法、线程同步与通信机制,以及多线程编程中可能遇到的问题和解决策略。 一、多线程...

    深入学习:Java多线程编程

    《深入学习:Java多线程编程》是一本专注于Java并发技术的专业书籍,旨在帮助开发者深入理解和熟练运用Java中的多线程编程。Java多线程是Java编程中的核心部分,尤其在现代高性能应用和分布式系统中不可或缺。理解并...

    Windows多线程编程技术与实例(C++)(PDF)

    《Windows多线程编程技术与实例(C++)》是一本深入探讨Windows环境下多线程编程的书籍,特别适合正在学习或已经从事C++多线程开发的人员阅读。本书通过丰富的实例,详细讲解了如何在Windows操作系统中利用C++进行...

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

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

    玩转多线程编程.pptx

    "多线程编程" 多线程编程是指在同一个程序中同时运行多个线程,以提高程序的执行效率和响应速度。多线程编程可以分为两类:用户级线程和内核级线程。用户级线程是在用户空间中实现的线程,内核级线程是在内核空间中...

    多线程编程中英文对照.rar

    在IT领域,多线程编程是一项关键技能,尤其是在操作系统如Symbian中。多线程技术允许程序同时执行多个任务,提升系统效率和用户体验。以下是对"多线程编程"这个主题的详细解释: 1. **多线程概念**:多线程是指一个...

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

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

    c++多线程编程的十个例子

    通过学习和实践这些例子,你将能够熟练掌握C++多线程编程的核心概念,并能够在Windows平台上有效地利用多核处理器的优势,编写高效且可靠的多线程程序。记住,多线程编程需要对并发控制和错误处理有深入的理解,才能...

    Linux多线程服务端编程:使用muduo C++网络库

    本书主要讲述采用现代C++ 在x86-64 Linux 上编写多线程TCP 网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。这是在Linux 下以native 语言编写用户态高性能...

    linux多线程编程概述.doc

    本篇将深入介绍Linux多线程编程的基本概念、实现方法以及注意事项。 首先,多线程是通过创建多个执行线程来实现并发执行的。每个线程都有自己的调用栈,可以独立执行代码,共享同一地址空间内的资源,如全局变量和...

    CC++多线程编程练习题大全

    通过以上知识点的学习和实践,可以深入理解CC++多线程编程,解决并发问题,提升程序性能。提供的文件列表可能包含各种多线程编程的练习题目,包括新员工培训的习题纲要,这些资源对于提升编程技能和理论理解非常有...

Global site tag (gtag.js) - Google Analytics