Java线程调度与线程优先级

文章目录

    • 一、线程调度
      • 1.1 协同式线程调度
      • 1.2 抢占式线程调度
    • 二、线程优先级
    • 三、线程中的状态转换

一、线程调度

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

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):已终止线程的线程状态,线程已经结束执行。

Java线程调度与线程优先级_第1张图片

线程状态转换关系

你可能感兴趣的:(jvm虚拟机,并发编程)