1、线程优先级
现代操作系统基本采用时分的形式调度运行的线程,操作系统会分出一个个时间片,线程被分配到的时间片用完了就会发生线程调度,等待的下次分配。线程分配到的时间片多少决定了线程使用处理器资源的多少,而线程优先级就是决定线程需要多或者少分配一些处理器资源的线程属性。
Java线程中,通过一个整型成员变量priority来控制优先级,优先级范围1—10,在线程构建的时候可以通过setPriority(int)方法来修改优先级,默认优先级是5,优先级搞得线程分配到的时间片数量要多于优先级低的线程,但这并不代表的线程就一定先执行。
设置线程优先级时,针对频繁阻塞(休眠或者I/O操 作)的线程需要设置较高优先级,而偏重计算(需要较多CPU时间或者偏运算)的线程则设置较 低的优先级,确保处理器不会被独占。
2、线程优先级的特性(3条)
1)线程优先级的无序性:线程优先级有随机的特性。
2)线程优先级的继承性:继承关系中优先级一样,加入线程A启动线程B,那么A线程和B线程的优先级一样。
3)线程优先级的规则性:线程会优先级的大小顺序执行,但并不代表优先级大的一定先执行。
线程的继承性代码示例:
设置优先级之前:
package Testpriority;
public class Testpriori {
public static void main(String[] args) {
System.out.println("Thread1 Priority = " + Thread.currentThread().getPriority());//输出级别
MyThread1 myThread1 = new MyThread1();
myThread1.start();//启动一个线程1
}
}
class MyThread1 extends Thread {//验证继承关系
@Override
public void run() {
super.run();
System.out.println("MyThread1 Priority = " + this.getPriority()); //输出继承线程的级别
}
}
结果:
Thread1 Priority = 5
MyThread1 Priority = 5
Process finished with exit code 0
设置优先级之后:
public class Testpriori {
public static void main(String[] args) {
Thread.currentThread().setPriority(8);//设置优先级过程
System.out.println("Thread1 Priority = " + Thread.currentThread().getPriority());//输出级别
MyThread1 myThread1 = new MyThread1();
myThread1.start();//启动一个线程1
}
}
class MyThread1 extends Thread {//验证继承关系
@Override
public void run() {
super.run();
System.out.println("MyThread1 Priority = " + this.getPriority()); //输出继承线程的级别
}
}
结果:
Thread1 Priority = 8
MyThread1 Priority = 8
以上可见线程优先级的继承性。
参考书籍《Java并发编程的艺术》