1、线程调度算法:

  背景:计算机的CPU在任意时刻只能执行一条机器指令,每个线程只有获得CPU 的使用权才能执行指令。所谓多线程的并发运行,其实是指从宏观上看,各个线程轮流获得CPU 的使用权,分别执行各自的任务。在运行池中,会有多个处于就绪状态的线程在等待CPU,JA VA 虚拟机的一项任务就是负责线程的调度。

  线程调度是指按照特定机制为多个线程分配CPU 的使用权。(Java是由JVM中的线程计数器来实现线程调度)

  两种调度模型:

轮流获得cpu 的使用权,并且平均分配每个线程占用的CPU的时间片;

  2)Java虚拟机采用抢占式调度模型:指优先让可运行池中优先级高的线程占用CPU,如果可运行池中的线程优先级相同,那么就随机选择一个线程,使其占用CPU。处于运行状态的线程会一直运行,直至它不得不放弃CPU。

 

2、调度策略:

  线程调度器选择优先级最高的线程运行,但是,如果发生以下情况,就会终止线程的运行:

  1)线程体中调用了yield 方法让出了对cpu 的占用权利;

  2)线程体中调用了sleep 方法使线程进入睡眠状态;

  3)线程由于IO 操作受到阻塞;

  4)另外一个更高优先级线程出现;

  5)在支持时间片的系统中,该线程的时间片用完。

 

3、线程调度器(Thread Scheduler)和时间分片(Time Slicing )

  1)线程调度器是一个操作系统服务,它负责为Runnable 状态(就绪状态)的线程分配CPU 时间。一旦我们创建一个线程并启动它,它的执行便依赖于线程调度器的实现。

基于线程优先级或者线程等待的时间。

3)线程调度并不受到Java 虚拟机控制,所以由应用程序来控制它是更好的选择(也就是说不要让你的程序依赖于线程的优先级)。