java 多线程基础--各种状态及状态之间的转换

线程转换图


线程在它的生命周期中会处于各种不同的状态:

新建、等待、就绪、运行、阻塞、死亡。
1 新建

用new语句创建的线程对象处于新建状态,此时它和其他java对象一样,仅被分配了内存。

2等待

当线程在new之后,并且在调用start方法前,线程处于等待状态。   --2012-12-21

3 就绪

当一个线程对象创建后,其他线程调用它的start()方法,该线程就进入就绪状态。处于这个状态的线程位于Java虚拟机的可运行池中,等待cpu的使用权。
4 运行状态
处于这个状态的线程占用CPU,执行程序代码。在并发运行环境中,如果计算机只有一个CPU,那么任何时刻只会有一个线程处于这个状态。
 只有处于就绪状态的线程才有机会转到运行状态。
5 阻塞状态
阻塞状态是指线程因为某些原因放弃CPU,暂时停止运行。当线程处于阻塞状态时,Java虚拟机不会给线程分配CPU,直到线程重新进入就绪状态,它才会有机会获得运行状态。
6 死亡状态
当线程执行完run()方法中的代码,或者遇到了未捕获的异常,就会退出run()方法,此时就进入死亡状态,该线程结束生命周期。
 
 
由于java线程调度不是分时的,如果程序希望干预java虚拟机对线程的调度过程,从而明确地让一个线程给另外一个线程运行的机会,可以采用以下的方法
    1 调整各个线程的优先级
    2 让处于运行状态的线程调用Thread.sleep(long time)方法 放弃CPU 进入阻塞状态 

                                                           sleep方法可能抛出InterruptedException

       线程休眠后只能在指定的时间后使线程处于就绪状态。(也就是等待cpu的调度)

    3 让处于运行状态的线程调用Thread.yield()方法 只会同优先级让步或更高优先级让步  进入就绪状态
    4 让处于运行状态的线程调用另一个线程的join()方法

       当前运行的线程可以调用另一个线程的join()方法,当前运行的线程将转到阻塞状态,直至另一个线程运行结束,它才会转到就绪状态 从而有机会恢复运行。


 通过一下几种途径中的一种,线程可以从被阻塞状态到可运行状态。
        1 线程被置于睡眠状态,且已经经过指定的毫秒数。
        2 线程正在等待I/O操作的完成,且该操作已经完成。
        3 线程正在等待另一个线程所持有的锁,且另一个线程已经释放该锁的所有权;(也有可能等待超时。当超时发生时,线程解除阻塞。)
        4 线程正在等待某个触发条件,且另一个线程发出了信号表明条件已经发生了变化。(如果为线程的等待设置了一个超时,那么当超时发生时该线程将解除阻塞。)
        5 线程已经被挂起,且有人调用了它的resume方法。不过,由于suspend方法已经过时,resume方法也就随之被弃用了,你不应该在自己的代码里调用它。(现在应该用sleep取而代之。)

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值