可以使用java的线程优先级来实现业务的优先级调度,java的线程调度策略是一种基于优先级
00-1010示例:1。定义一个线程执行器,异步执行:2 .创建10个线程,设置不同的线程优先级来执行线程执行器:3。运行结果:总结由于CPU的计算频率很高,每秒计算数十亿次,所以可以从毫秒维度对CPU时间进行分段,每个分段称为一个CPU时间片。
目前操作系统中主流的线程调度方式是:基于CPU时间片的线程调度。一个线程只有获得一个CPU时间片,才能执行指令,处于执行状态。没有CPU时间片的线程处于就绪状态,等待系统分配下一个CPU时间片。因为时间片很短,而且在线程之间切换很快,所以它的特点是很多线程同时或并发执行。
目前有两种线程调度模型:分时调度模型和抢占式调度模型。
(1)分时调度模式:系统平均分配CPU时间片,所有线程轮流占用CPU,即所有线程在时间片调度的分配上是平等的。
(2)抢占式调度模型:系统根据线程优先级分配CPU时间片。优先级高的线程优先分配CPU时间片。如果所有就绪线程具有相同的优先级,将随机选择一个。优先级高的线程获得更多的CPU时间片。
目前大部分操作系统采用抢占式调度模型进行线程调度,Java的线程管理和调度都委托给操作系统。相应的,Java的线程调度也采用抢占式调度模式,所以Java的线程是有优先级的。
Thread类中有一个实例属性和两个实例方法,专门用于线程优先级相关的操作。与线程优先级相关的成员属性有:
//保存Thread线程实例的优先级,private int优先级在1到10之间;//Get线程优先级public final int get priority () {//.}//设置线程优先级public final void设置优先级(int priority) {//.}线程实例的优先级属性默认为5级,对应的类常量为NORM_PRIORITY。最大优先级值为10,最小值为1。Thread类中定义的三个优先级常量如下:
public final static int MIN _ PRIORITY=1;public final static int NORM _ PRIORITY=5;public final static int MAX _ PRIORITY=10;Java使用抢占式调度模型进行线程调度。priority实例属性的优先级越高,线程获得CPU时间片的机会就越多,但也不是绝对的。
目录
示例:
公共类ThreadDemo扩展Thread { private long num=0;public long getNum(){ return num;} @Override public void run() {//线程执行器:无限循环for(int I=0;I){ num;} }}
1、定义一个线程执行体,异步执行:
公共类Main { public static void Main(String[]args)抛出interrupted exception { thread demo[]threads=new thread demo[10];for(int I=0;ithreads.lengthI){ threads[I]=new thread demo();//设置1到10个线程的线程优先级[i]。set priority(i1);}//启动线程for(int I=0;ithreads.lengthi ){ threads[i]。start();}//等待线程1s thread . sleep(1000);//停止线程for(int I=0;ithreads.lengthi ){ threads[i]。stop();} for(int I=0;ithreads.length
i++){ System.out.println(threads[i].getName() +"-优先级为-"+threads[i].getPriority() +"-机会值为-"+threads[i].getNum()); } }}在线程的run()方法中,设置了一个没有条件判断表达式的for循环,这是一个死循环,线程启动之后,永远也不会退出,直到线程被停止。那么,问题来了:如何停止这10个线程呢?这里使用Thread类的stop()实例方法,该方法的作用是终止线程的执行。
Thread类的stop()实例方法是一个过时的方法,也是一个不安全的方法。这里的安全指的是系统资源(文件、网络连接等)的安全——stop()实例方法可能导致资源状态不一致,或者说资源出现问题时很难定位。在实际开发过程中,不建议使用stop()实例方法。
3、运行结果:
Thread-0-优先级为-1-机会值为-0Thread-1-优先级为-2-机会值为-0Thread-2-优先级为-3-机会值为-0Thread-3-优先级为-4-机会值为-0Thread-4-优先级为-5-机会值为-3038296Thread-5-优先级为-6-机会值为-4473657Thread-6-优先级为-7-机会值为-2521154868Thread-7-优先级为-8-机会值为-2537430692Thread-8-优先级为-9-机会值为-2708120258Thread-9-优先级为-10-机会值为-2690953898
演示示例中10个线程停下来之后,某个线程的实例属性opportunities的值越大,就表明该线程获得的CPU时间片越多。分析案例的执行结果,可以得出以下结论:
(1) 整体而言,高优先级的线程获得的执行机会更多。从实例中可以看到:优先级在5级以上的线程执行机会明显偏多,整体对比非常明显。
(2) 执行机会的获取具有随机性,优先级高的不一定获得的机会多。比如,例子中的thread-9比thread-8优先级高,但是thread-9所获得的机会反而偏少。
注意:
(1) 线程优先级会提示调度器优先调度该线程,它仅仅是一个提示,调度器可以忽略它。
(2) 如果CPU比较忙,那么优先级高的线程会获得更多的时间片,但是CPU闲时,优先级几乎没作用。
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注盛行IT的更多内容!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。