11.4.2 线程调度与优先级

11.4.2 线程调度与优先级

1.线程调度

当线程数多于处理机的数目时,势必存在各个线程争用CPU的情况,这就需要提供一种机制来合理地分配CPU,使多个线程有条不紊、互不干扰地工作,这一机制称为调度。在Java运行系统中,由线程调度器对线程进行调度。如果发生下列情况之一,调度器就会终止此线程的运行:

本线程的线程体中调用了yield()方法,从而让出了对CPU的占有权;本线程的线程体中调用了sleep()方法,使线程进入睡眠状态;本线程由于I/O操作而进入阻塞状态;

另一个具有更高优先级的线程从睡眠状态被唤醒,或I/O操作完成而返回可运行状态。

Java的线程调度算法可分为两种:一种是优先抢占式;另一种是轮转调度。

当线程的优先级不同时,为保证优先级最高的线程先运行而采用优先抢占式调度算法,即优先级高的线程优先抢占CPU。

当若干个线程具有相同的优先级时,采用队列轮转调度算法,即当一个线程运行结束时,选择调度该优先队列中排在最前面的线程运行。如果某个线程由于睡眠或I/O阻塞成为一个有待再次运行的线程时,则当它恢复到可运行状态后,被插入到该队列的队尾,必须等其他具有相同优先级的线程都调度过一次后,才有机会再次运行。

2.线程优先级

设置优先级便于系统在多线程环境中对线程进行调度。

Java线程的优先级用数字来表示,是一个在1~10之间的正整数,数值越大,优先级越高,MIN_PRIORITY的值最小为1,MAX_PRIORITY的值最大为10。未设定优先级的线程其优先级取缺省值5,即没有给线程优先级赋值时,线程优先级NORM_PRIORITY值为5。

Thread类中对优先级进行操作的方法有:

public int getPriority()

返回线程的优先级。

public void setPriority(int newPriority)

设置线程的优先级为newPriority。