现在主流操作系统的任务调度除了具有时间片轮转的特点外,还有优先级调度(Priority Schedule)的特点。优先级调度决定了线程按照什么顺序轮流执行,在具有优先级调度的系统中,线程拥有各自的线程优先级(Thread Priority)。具有高优先级的线程会更早地执行,而低优先级的线程通常要等没有更高优先级的可执行线程时才会被执行。本文我们就一起来谈一谈线程优先级的那些事儿。
线程优先级可以由用户手动设置,此外系统也会根据不同情形调整优先级。通常情况下,频繁地进入等待状态(进入等待状态会放弃之前仍可占用的时间份额)的线程(如IO线程),比频繁进行大量计算以至于每次都把所有时间片全部用尽的线程更受操作系统的欢迎。因为频繁进入等待的线程只会占用很少的时间,这样操作系统可以处理更多的任务。我们把频繁等待的线程称之为IO密集型线程(IO Bound Thread),而把很少等待的线程称之为CPU密集型线程(CPU Bound Thread)。IO密集型线程总是比CPU密集型线程更容易得到优先级的提升。
Java线程有优先级的设定,高优先级的线程比地优先级的线程有更高的几率得到执行。但优先级低只是意味着获得调度的概率低。并不是绝对先调用优先级高的线程后调用优先级低的线程。因此在学习线程优先级的过程中我们要注意以下几点:
1.当前线程没有指定优先级时,所有线程都是普通优先级。
2.优先级从1到10的范围指定。10表示最高优先级,1表示最低优先级,5是普通优先级。
3.优先级最高的线程在执行时被给予优先。但是不能保证线程在启动时就进入运行状态。
4.与在线程池中等待运行机会的线程相比,正在运行的线程可能总是拥有更高的优先级。
5.由调度程序决定哪一个线程被执行。
6.t.setPriority()用来设定线程的优先级。
7.记住在线程开始方法被调用之前,线程的优先级应该被设定。
8.可以使用常量,如MIN_PRIORITY,MAX_PRIORITY,NORM_PRIORITY来设定优先级。
Java线程优先级是一个整数,其取值范围是1 (Thread.MIN_PRIORITY ) - 10 (Thread.MAX_PRIORITY )。
public static final int MIN_PRIORITY = 1;
public static final int NORM_PRIORITY = 5;
public static final int MAX_PRIORITY = 10;
其实不然。默认的优先级是父线程的优先级。在init方法里,
Thread parent = currentThread();
this.priority = parent.getPriority();
可以通过setPriority方法(final的,不能被子类重载)更改优先级。优先级不能超过1-10的取值范围,否则抛出IllegalArgumentException。另外如果该线程已经属于一个线程组(ThreadGroup),该线程的优先级不能超过该线程组的优先级。在优先级调度环境下,线程优先级的改变有三种方式:
1. 用户指定优先级;
2. 根据进入等待状态的频繁程度提升或降低优先级(由操作系统完成);
3. 长时间得不到执行而被提升优先级。
好了,以上就是关于线程优先级的相关知识,总的来说,线程优先级对线程资源的分配起到了很大的作用,但切莫把线程优先级当做银弹,优先级高的线程不一定比优先级低的线程优先执行。关于多线程的相关知识在本站的Java多线程教程中还有更加生动形象的讲解,想要学习Java多线程的小伙伴不容错过!
你适合学Java吗?4大专业测评方法
代码逻辑 吸收能力 技术学习能力 综合素质
先测评确定适合在学习