所谓多线程的并发运行,其实就是指各个线程轮流获得CPU的使用权,分别执行各自的任务。CPU的功能主要就是用于中断、内核以及用户进程处理,优先级分为中断>内核>用户进程,而线程何时获得CPU的使用权是由Java虚拟机说了算的。

Java虚拟机的一项任务就是负责线程的调度。线程的调度是指按照特定的机制为多个线程分配CPU的使用权。有两种调度模型:
1 分时调度模型
2 抢占式调度模型。
分时调度模型是让所有线程轮流获得CPU的使用权,并且平均分配每个线程占用的CPU的时间片。
java虚拟机采用抢占式调度模型,它是指优先让可运行池中优先级高的线程占用CPU,如果可运行池中线程的优先级相同,那么就随机的选择一个线程,使其占用CPU。处于运行状态的线程会一直占有CPU运行,直至它不得不放弃CPU。一般有下面3个原因:

java虚拟机让当前线程暂时放弃cpu 转到就绪状态,使其他线程获得运行机会;
时间片已经到了,即到达了执行时间;
当前线程因为某些原因而进入阻塞状态;
线程中发生了IO阻塞或者更高的优先级要执行;
线程已经运行结束;
值得注意的是,线程的调度不是跨平台的。
它不仅取决于java虚拟机,还依赖于操作系统。
在某些系统中,只要运行的线程没有遇到阻塞,就不会放弃CPU,在某些系统中,即使没有遇到阻塞,也会运行一段时间后放弃CPU,给其他线程运行的机会。

由于java线程调度不是分时的,如果程序希望干预java虚拟机对线程的调度过程,从而明确地让一个线程给另外一个线程运行的机会,可以采用以下的方法
1 调整各个线程的优先级
2 让处于运行状态的线程调用Thread.sleep(long time)方法 放弃CPU 进入阻塞状态 sleep方法可能抛出InterruptedException
3 让处于运行状态的线程调用Thread.yield()方法 只会同优先级让步或更高优先级让步 进入就绪状态
4 让处于运行状态的线程调用另一个线程的join()方法
当前运行的线程可以调用另一个线程的join()方法,当前运行的线程将转到阻塞状态,直至另一个线程运行结束,它才会转到就绪状态 从而有机会恢复运行