专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Java教程 » java多线程:Java线程的深入探讨 »正文

java多线程:Java线程的深入探讨

来源: 发布时间:星期三, 2008年12月17日 浏览:65次 评论:0
        1.什么是线程
  般来说,我们把正在计算机中执行叫做"进程"(Process) ,而不将其称为(Program)所谓"线程"(Thread),是"进程"中某个单顺序控制流新兴操作系统,如Mac,Windows NT,Windows 95等,大多采用多线程概念,把线程视为基本执行单位线程也是Java中相当重要组成部分的

  甚至最简单Applet也是由多个线程来完成在Java中,任何个Appletpa和update思路方法都是由AWT(Abstract Window Toolkit)绘图和事件处理线程,而Applet 主要里程碑思路方法——init,start,stop和destory ——是由执行该Applet应用

  单线程概念没有什么新地方,真正有趣是在中同时使用多个线程来完成区别任务某些地方用轻量进程(Lightweig ht Process)来代替线程和真正进程相似性在于它们都是单顺序控制流然而线程被认为轻量是由于它运行于整个上下文内,能使用整个共有资源和环境

  作为单顺序控制流,在运行内线程必须拥有些资源作为必要开销例如,必须有执行堆栈和计数器在线程内执行代码只在它上下文中起作用,因此某些地方用"执行上下文"来代替"线程"

  2.线程属性
  为了正确有效地使用线程,必须理解线程各个方面并了解Java 实时系统必须知道如何提供线程体、线程生命周期、实时系统如 何调度线程、线程组、什么是幽灵线程(Demo nThread)

  (1)线程体
  所有操作都发生在线程体中,在Java中线程体是从Thread类继承run思路方法,或实现Runnable接口类中run思路方法当线程产生并化后,实时系统run思路方法run思路方法内代码实现所产生线程行为,它是线程主要部分

  (2)线程状态
  附图表示了线程在它生命周期内任何时刻所能处状态以及引起状态改变思路方法这图并不是完整有限状态图,但基本概括了线程中比较感兴趣和普遍方面以下讨论有关线程生命周期以此为据


  ●新线程态(New Thread)
  产生个Thread对象就生成个新线程当线程处于"新线程"状态时,仅仅是个空线程对象,它还没有分配到系统资源因此只能启动或终止它任何其他操作都会引发异常
  ●可运行态(Runnable)
  start思路方法产生运行线程所必须资源,调度线程执行,并且线程run思路方法在这时线程处于可运行态该状态不称为运行态是这时线程并不总是直占用处理机特别是对于只有个处理机PC而言,任何时刻只能有个处于可运行态线程占用处理 机Java通过调度来实现多线程对处理机共享

  ●非运行态(Not Runnable)
  当以下事件发生时,线程进入非运行态
  ①suspend思路方法被;
  ②sleep思路方法被;
  ③线程使用wait来等待条件变量;
  ④线程处于I/O等待
  ●死亡态(Dead)
  当run思路方法返回,或别线程stop思路方法,线程进入死亡态 通常Applet使用它stop思路方法来终止它产生所有线程

  (3)线程优先级
  虽然我们说线程是并发运行然而事实常常并非如此正如前面谈到,当系统中只有个CPU时,以某种顺序在单CPU情况下执行多线程被称为调度(scheduling)Java采用种简单、固定调度法,即固定优先级调度这种算法是根据处于可运行态线程相对优先级来实行调度当线程产生时,它继承原线程优先级在需要时可对优先级进行修改在任何时刻,如果有多条线程等待运行,系统选择优先级最高可运行线程运行只有当它停止、自动放弃、或由于某种原因成为非运行态低优先级线程才能运行如果两个线程具有相同优先级,它们将被交替地运行
  Java实时系统线程调度算法还是强制性,在任何时刻,如果个比其他线程优先级都高线程状态变为可运行态,实时系统将选择该线程来运行

  (4)幽灵线程
  任何个Java线程都能成为幽灵线程它是作为运行于同个进程内对象和线程服务提供者例如,HotJava浏览器有个称为" 后台图片阅读器"幽灵线程,它为需要图片对象和线程从文件系统或网络读入图片
  幽灵线程是应用中典型独立线程它为同应用中其他对象和线程提供服务幽灵线程run思路方法般都是无限循环,等待服务请求

  (5)线程组
  每个Java线程都是某个线程组成员线程组提供种机制,使得多个线程集于个对象内,能对它们实行整体操作譬如,你能用个思路方法来启动或挂起组内所有线程Java线程组由ThreadGroup类实现
  当线程产生时,可以指定线程组或由实时系统将其放入某个缺省线程组内线程只能属于个线程组,并且当线程产生后不能改变它所属线程组

  3.多线程
  对于多线程好处这就不多说了但是,它同样也带来了某些新麻烦只要在设计时特别小心留意,克服这些麻烦并不算太困难

  (1)同步线程
  许多线程在执行中必须考虑和其他线程的间共享数据或协调执行状态这就需要同步机制在Java中每个对象都有把锁和的对应但Java不提供单独lock和unlock操作它由高层结构隐式实现, 来保证操作对应(然而,我们注意到Java虚拟机提供单独monito renter和monitorexit指令来实现lock和unlock操作)
  synchronized语句计算个对象引用,试图对该对象完成锁操作, 并且在完成锁操作前停止处理当锁操作完成synchronized语句体得到执行当语句体执行完毕(无论正常或异常),解锁操作自动完成作为面向对象语言,synchronized经常和思路方法连用种比较好办法是,如果某个变量由个线程赋值并由别线程引用或赋值,那么所有对该变量访问都必须在某个synchromized语句或synchronized思路方法内
  现在假设种情况:线程1和线程2都要访问某个数据区,并且要求线程1访问先于线程2, 则这时仅用synchronized是不能解决问题这在Unix或WindowsNT中可用Simaphore来实现而Java并不提供在Java中提供是wait和noty机制使用如下:

synchronized method - 1(...) {
call by thread 1.
//access data area;
available = true;
noty
}
synchronized method - 2(...) { //call by thread 2.
while (!available) {
try {
wait; //wait for noty.
} catch (Interrupted Exception e) {
}
}
//access data area
}

  其中available是类成员变量,置初值为false
  如果在method-2中检查available为假,则waitwait作用是使线程2进入非运行态,并且解锁在这种情况下,method-1可以被线程1当执行noty线程2由非运行态转变为可运行态当method-1返回后线程2
可重新对该对象加锁,加锁成功后执行wait返回后指令这种机制也能适用于其他更复杂情况

  (2)死锁
  如果中有几个竞争资源并发线程,那么保证均衡是很重要系统均衡是指每个线程在执行过程中都能充分访问有限资源系统中没有饿死和死锁线程Java并不提供对死锁检测机制对大多数Java员来说防止死锁是种较好选择最简单防止死锁思路方法是对竞争资源引入序号,如果个线程需要几个资源,那么它必须先得到小序号资源,再申请大序号资源

  4.小结
  线程是Java中重要内容,多线程是Java个特点虽然Java同步互斥不如某些系统那么丰富,但适当地使用它们也能收到满意效果

        run思路方法返回后线程进入死亡态

        死亡态(Dead)
  当run思路方法返回,或别线程stop思路方法,线程进入死亡态 通常Applet使用它stop思路方法来终止它产生所有线程
0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: