首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java线程调度与线程优先级

Java线程调度与线程优先级

作者头像
栋先生
发布2018-09-29 16:58:46
1.9K0
发布2018-09-29 16:58:46
举报
文章被收录于专栏:Java成长之路Java成长之路

一、线程调度

线程调度是指系统为线程分配处理器使用权的过程,主要调度方式有两种,分别是协同式线程调度抢占式线程调度

1.1 协同式线程调度

协同式线程调度,线程的执行时间由线程本身控制。协同式线程调度,线程执行时间由线程本身来控制,线程把自己的工作执行完之后,要主动通知系统切换到另外一个线程上。

  • 优点:实现简单,且切换操作对线程自己是可知的,没啥线程同步问题。
  • 缺点:线程执行时间不可控制,如果一个线程有问题,可能一直阻塞在那里。

1.2 抢占式线程调度

抢占式调度,每个线程将由系统来分配执行时间,线程的切换不由线程本身来决定

Java中,Thread.yield()可以让出执行时间,但无法获取执行时间。

优点:线程执行时间系统可控,也不会有一个线程导致整个进程阻塞。

二、线程优先级

如果希望系统能给某些线程多分配一些时间,给一些线程少分配一些时间,可以通过设置线程优先级来完成。 Java语言一共10个级别的线程优先级(Thread.MIN_PRIORITY至Thread.MAX_PRIORITY),在两线程同时处于ready状态时,优先级越高的线程越容易被系统选择执行。但优先级并不是很靠谱,因为Java线程是通过映射到系统的原生线程上来实现的,所以线程调度最终还是取决于操作系统。

三、线程中的状态转换

Java定义了5种线程状态,在任意一个点一个线程只能有且只有其中一种状态。无限等待和等待可以算在一起。所以共五种。

  1. 新建(New):创建后尚未启动的线程。
  2. 运行(Runnable):Runnable包括操作系统线程状态中的Running和Ready,也就是处于此状态的线程有可能正在执行,也有可能等待CPU为它分配执行时间。线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于“可运行线程池”中,变得可运行,只等待获取CPU的使用权。即在就绪状态的进程除CPU之外,其它的运行所需资源都已全部获得。
  3. 无限期等待(Waiting):该状态下线程不会被分配CPU执行时间,要等待被其他线程显式唤醒。如没有设置timeout的object.wait()方法和Thread.join()方法,以及LockSupport.park()方法。
  4. 限期等待(Timed Waiting):不会被分配CPU执行时间,不过无须等待被其他线程显式唤醒,在一定时间之后会由系统自动唤醒。如Thread.sleep(),设置了timeout的object.wait()thread.join()LockSupport.parkNanos()以及LockSupport.parkUntil()方法。
  5. 阻塞(Blocked):线程被阻塞了。与等待状态的区别是:阻塞在等待着获取到一个排他锁,这个事件将在另外一个线程放弃这个锁的时候发生;而等待则在等待一段时间,或唤醒动作的发生。在等待进入同步区域时,线程将进入这种状态。
  6. 结束(Terminated):已终止线程的线程状态,线程已经结束执行。
mark
mark

线程状态转换关系

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年07月08日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、线程调度
    • 1.1 协同式线程调度
      • 1.2 抢占式线程调度
      • 二、线程优先级
      • 三、线程中的状态转换
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档