zoukankan      html  css  js  c++  java
  • (三)多线程:线程的生命周期

     当线程被创建并启动后,它既不是一启动就进入了执行状态,也不是一直处于执行状态,在线程的生命周期中,它要经过新建(New),就绪(Runnable),运行(Running),阻塞(Blocked),死亡(Dead)5中状态。尤其是当线程启动以后,它不可能一直“霸占”着CPU独自运行,所以CPU需要在多条线程之间切换,于是线程状态也就会多次在运行,阻塞之间切换。

    一.新建和就绪状态

     新建状态:当程序使用new关键字创建了一个线程之后,该线程就处于新建状态,此时它和其他Java对象一样仅仅由Java虚拟机为其分配内存,初始化其成员变量的值。此时的线程对象没有表现出任何线程的动态特征,程序也不会执行线程的线程执行体。

     就绪状态:当线程对象调用了start()方法之后,该线程处于就绪状态,Java虚拟机会为其创建方法调用栈和程序计数器,处于这个状态中的线程并没有开始运行,只是表示该线程可以运行了。至于该线程何时开始运行,取决于JVM里线程调度器的调度。

    注意:启动线程使用start()方法,而不是run()方法,永远不要调用线程对象的run()方法!调用start()方法来启动线程;但如果直接调用run()方法,则run()方法会立即被执行。而且在run()方法返回之前其他线程无法并发执行——直接调用run()方法,系统把线程对象当成一个普通对象,run()方法也是一个普通方法,而不是线程体。

    注意:start()方法调用只能针对新建状态的线程,否则将引发Illegalthreadstateexception异常。

    二.运行和阻塞状态

     如果处于就绪状态的线程获得了CPU,开始执行run()方法的线程执行体,则该线程处于运行状态,如果计算机只有一个CPU,那么任何时刻只有一个线程处于运行状态。当然,在一个多处理器的机器上,就会有多个线程并行执行;当线程数大于处理器数时,依然会存在多个线程在通一个CPU上轮换的现象。
     当一个线程开始运行后,它不可能一直处于运行状态(除非它的线程执行体足够短,瞬间就执行结束了),线程在运行过程中需要被中断,目的是使其它线程获得执行机会,线程调度的细节取决于底层平台所采用的策略。对于采用抢占式策略的系统而言,系统会给每个可执行的线程一个小时间断来处理任务;当该时间段用完后,系统会剥夺线程所占用的资源,让其他线程获得执行的机会,在选择下个线程时,系统会考虑线程的优先级。
     只有当一个线程调用了它的sleep()或yield()方法后才会放弃所占用的资源——也就是必须由该线程主动放弃所占用的资源。

    发生如下情况,线程将会进入阻塞状态:

    • 线程调用sleep()方法主动放弃占用的处理器资源。
    • 线程调用了一个阻塞式IO方法,在该方法返回之前,该线程被阻塞。
    • 线程试图获得一个同步监视器,但该同步监视器正被其他线程所持有。
    • 线程在等待某个通知(notify)。
    • 程序调用了线程的suspend()方法将该线程挂起。但是这个方法容易造成死锁,所以应该尽量避免使用该方法。

     当前正在执行的线程被阻塞之后,其他线程就可以获得执行的机会。被阻塞的线程会在合适的时候重新进入就绪状态,注意是就绪状态而不是运行状态。也就是说,被阻塞线程的阻塞解除后,必须重新等待线程调度器再次调用它。

    发生如下情况,可以解除上面的阻塞,让线程重新进入就绪状态:

    • 调用sleep()方法的线程经过了指定时间。
    • 线程调用的阻塞式IO方法已经返回。
    • 线程成功的获得了试图取得的同步监视器。
    • 线程正在等待某个通知时,其他线程发出了一个通知。
    • 处于挂起状态的线程被调用了resume()恢复方法。

    线程状态转换图:

    三.线程死亡

    线程会以如下三种方式结束,结束后就处于死亡状态:

    • run()或call()方法执行完成,线程正常结束。
    • 线程抛出一个未捕获的Exception或Error
    • 直接调用该线程的stop()方法来结束线程——容易导致死锁,不推荐使用。

    注意:不要对处于死亡状态的线程调用start()方法,程序只能对新建状态的线程调用start()方法,对新建状态的线程两次调用start()方法也是错误的。这都会引发Illegalthreadstateexception异常。

    文章内容均取自《疯狂Java讲义-李刚》一书中多线程章节。截取重要知识点作为笔记记录,方便自己回顾。

  • 相关阅读:
    周末之个人杂想(十三)
    PowerTip of the DaySorting Multiple Properties
    PowerTip of the DayCreate Remoting Solutions
    PowerTip of the DayAdd Help to Your Functions
    PowerTip of the DayAcessing Function Parameters by Type
    PowerTip of the DayReplace Text in Files
    PowerTip of the DayAdding Extra Information
    PowerTip of the DayPrinting Results
    Win7下IIS 7.5配置SSAS(2008)远程访问
    PowerTip of the DayOpening Current Folder in Explorer
  • 原文地址:https://www.cnblogs.com/everyingo/p/12788331.html
Copyright © 2011-2022 走看看