在java语言中,每个线程都有一个优先级,当线程调控器有机会选择新的线程时,线程的优先级越高越有可能先被选择执行。
在java里,线程的优先级可以设置1-10,数字越大代表优先级越高。默认情况下,一个线程继承它的父线程的优先级,即如果用A线程启动B线程,那么B线程的优先级就和A线程的优先级一致。也可以用setPriority方法提高或降低任一个线程的优先级。
但是,根据《JAVA核心技术》所讲的,线程的优先级是高度依赖于系统的。
举个具体的例子:
在windows系统中,有7个优先级级别,但是在java语言里是有10个优先级别的,不能做到一一对应,所以至少会有两个优先级共享相同的windows操作系统优先级。
而在Oracle为Linux提供的java虚拟机中,线程的优先级将被忽略,即所有线程具有相同的优先级。
所以,不要过度依赖优先级。
还有,并不是说A线程的优先级比B的高,A线程执行完了才会执行B才会执行,只是A线程的优先级比较高所以cpu分配的资源比较多一些。
public class myThread05 extends Thread {
public void run(){
long begin = System.currentTimeMillis();
for (int i=0;i<50000000;i++){
}
long end = System.currentTimeMillis();
long time=end-begin;
System.out.println(Thread.currentThread().getName()+ "优先级为:"+this.getPriority()+" 执行完毕,花费时间为"+ time); // getPriority()方法可以获取线程的优先级
}
public static void main(String[] args) throws InterruptedException {
myThread05 mt = new myThread05();
myThread05 mt1 = new myThread05();
myThread05 mt2 = new myThread05();
mt1.setPriority(1);//设置线程的优先级为1
mt2.setPriority(10); //设置线程的优先级10
mt.start(); //默认情况下线程的优先级为5
mt1.start();
mt2.start();
}
}
多次运行,结果也不太一样,说明不一定是优先级高就先运行,只是获得cpu资源的可能性更大。
所以不要过度依赖优先级