Java高并发编程-线程状态

首先是线程的五种状态:

  • 新建状态(New) : 线程对象被创建后,就进入了新建状态。例如,Thread thread = new Thread()。
  • 就绪状态(Runnable): 也被称为“可执行状态”。线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程。例如,thread.start()。处于就绪状态的线程,随时可能被CPU调度执行。
  • 运行状态(Running) : 线程获取CPU权限进行执行。需要注意的是,线程只能从就绪状态进入到运行状态。* * 阻塞状态(Blocked) : 阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
    (01) 等待阻塞 – 通过调用线程的wait()方法,让线程等待某工作的完成。
    (02) 同步阻塞 – 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态。
    (03) 其他阻塞 – 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
  • 死亡状态(Dead) : 线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

图片引用来自:https://www.cnblogs.com/happy-coder/p/6587092.html

  1. 线程死亡:
    (1)run() 或call() 执行完毕 线程正常结束
    (2)程序抛出一个异常或者错误
    (3)直接调用线程的stop()方法结束该线程----容易死锁
    (4)调用isAlive() 就绪 运行 阻塞 返回true 新建 死亡 返回false
  2. sleep()与yield() 的区别:
    (1)sleep会暂停当前线程 由CPU调度其他线程,不会理会优先级 但是yield() 只会给优先级相同或者更高的线程执行机会
    (2)sleep() 会将当前线程转为阻塞状态 直到经过阻塞状态转为就绪状态,但是yield() 不会进入阻塞状态,而是强制进入就绪状态,因此很可能又会立即执行
    (3)sleep() 抛出 InterruptedException 所以调用该方法必须搞定异常 但是yield() 没有抛出任何异常
    (4)sleep() 比yield()有更好的移植性 通常不建议使用yield() 来控制并发线程的执行
  3. synchronized可以修饰方法,代码块 但不可修饰构造器 成员变量。
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务