线程调度通常有两种模型,分别是抢占式调度模型和分时调度模型。Java使用的是抢占式调度模型,即按照线程优先级分配CPU时间片运行。在多线程开发中,可以通过控制线程状态变化来协调多个线程对CPU的占用。例如前面讲的线程休眠sleep()方法,让正在运行的程序进入阻塞状态,直到休眠时间结束再进入就绪状态;而线程让步yield()方法会让正在运行的线程直接进入就绪状态。下面介绍线程优先级、线程插队对线程调度的影响。
对于线程的调度,最直接的方式就是设置线程的优先级。Thread类public final void setPriority(int new Priority)用于更改线程的优先级。线程优先级用1~10的整数来表示,数字越大,优先级越高,即获得CPU执行的机会就越大。Thread类public final int getPriority()方法用于返回线程的优先级。
Thread类public final void join()throws Interrupted Exception方法提供了线程插队的功能,当某个线程中调用其他线程的join()方法时,调用该方法的线程将被阻塞,直到该join()方法加入的线程执行完毕才能解除阻塞。
【例6-4】
演示线程插队。
步骤1:在项目chapter6的src下新建cn.linaw.chapter6.demo02包,将cn.linaw.chapter6.demo01包下的Bank Account.java拷贝过来。
步骤2:新建一个提示任务类Pay Attention Task,如图6-9所示。
图6-9 提示任务Pay AttentionTask类(www.xing528.com)
步骤3:重新编写取钱任务Withdraw Money Task2类,如图6-10所示。
图6-10 取钱任务Withdraw MoneyTask2类
步骤4:下面通过测试用例ThreadJoin Test类来演示,如图6-11所示。
图6-11 线程join方法示例
本例中,JVM启动main线程,main线程中又创建取钱线程,在运行取钱线程过程中,当账户余额为1元时,创建提示线程,并调用join方法插队,从效果看,提示线程执行完毕后才继续执行该取钱线程。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。