线程的调度:java虚拟机会按照特定的机制为程序中每个线程分配CPU的使用权,这种机制被称为线程的调度。
线程的调度有两种模型:①分时调度模型②抢占式调度模型
分时调度模型:让所有线程轮流获得CPU的使用权,并且平均分配每个线程占用的CPU的时间片。
抢占式调度模型;让可运行池中优先级高的线程优先占用CPU,而对于优先级相同的线程,随机选择一个线程使其占用CPU,当它丢失了CPU的使用权后,再随机选择其他线程获取CPU的使用权。
java虚拟机默认采用抢占式调度模型。
线程的优先级:在应用程序中,如果要对线程进行调度,最直接的方式就是设置线程的优先级。优先级越高的线程获得CPU执行的机会越大,而优先级越低的线程获得CPU执行的机会越小。线程的优先级用1~10之间的整数来标识,数字越大优先级越高。
线程休眠:人为控制线程,使正在执行的线程暂停,将CPU让给别的线程,这时可以使用sleep(long millis),该方法可以让当前正在执行的线程暂停一段时间,进入休眠等待状态,当休眠结束后,线程会返回到就绪状态,而不是立即开始运行。
线程让步:线程让步通过yield()方法来实现,该方法与sleep(long millis)方法有点类似,都可以让当前正在运行的线程暂停,区别在于yield()方法不会阻塞该线程,它只是将线程转换成就绪状态,让系统的调度重新调度一次。当某个线程调用yield()方法之后,只有与当前线程优先级相同或者更高的线程才能获得执行的机会。
线程插队:现实中经常遇到 “插队情况”,同样在Thread类中提供了一个join()方法来实现这个“功能”。当在某个先线程中调用其他线程join()方法时,调用的线程将被阻塞,直到被join()方法加入的线程执行完后它才会继续运行。