你的位置:首页 > Java教程

[Java教程]线程优先级的理解


  1. package countPriority;
  2. /* 线程优先级用thread.setPriority(int a)( 1<=a<=10)方法来进行赋值
  3.  * 线程优先级有继承性,如果主线程启动threadA线程且threadA线程没有另外赋予优先级,则threadA线程优先级和main线程一样。优先级与执行顺序无关
  4.  * CPU尽量将执行资源让给线程优先级高的,即线程优先级高的总是会大部分先执行,但是不代表高优先级的线程全部都先执行完再执行低优先级的线程
  5.  * 优先级具有随机性,优先级高的不一定每次都先执行
  6.  * 本例中用一个变量的自增量来判断两个优先级不同的线程运行时哪个占用CPU资源多*/
  7. public class ThreadA extends Thread {
  8.     private long count = 0;
  9.   public long getCount(){
  10.      return count;
  11.   }
  12.     public void run(){
  13.      while(true){
  14.       this.count++;
  15.     }
  16.   }
  17. }
  18. public class ThreadB extends Thread{
  19.   private long count = 0;
  20.   public long getCount(){
  21.     return count;
  22.   }
  23.   public void run(){
  24.     while(true){
  25.      this.count++;
  26.     }
  27.     }
  28. }
  29. public class Run {
  30.  public static void main(String[] args) {
  31.    // TODO Auto-generated method stub
  32.    try{
  33.       System.out.println("main优先级:"+Thread.currentThread().getPriority());//得到main线程的优先级
  34.       ThreadA threadA = new ThreadA();
  35.       threadA.setName("threadA");
  36.       threadA.setPriority(Thread.NORM_PRIORITY-3);//threadA线程的优先级为2
  37.       threadA.start();
  38.       ThreadB threadB = new ThreadB();
  39.       threadB.setName("threadB");
  40.       threadB.setPriority(Thread.NORM_PRIORITY+3);//threadB线程的优先级为8
  41.       threadB.start();
  42.       Thread.sleep(2000); //将主线程暂停2秒
  43.       threadA.stop();  //这里将线程强行停止,不建议使用stop()方法,该方法在JDK中被表明是“作废/过期”的方法
  44.       threadB.stop();
  45.       System.out.println("a= "+threadA.getCount()); 
  46.       System.out.println("b= "+threadB.getCount());
  47.    }catch(InterruptedException ie){
  48.      ie.printStackTrace();
  49.    }
  50.   }
  51. }

运行结果如下图

    输出结果b>a说明了两个线程在执行时threadB线程占用CPU的资源比threadA更多。虽然线程优先级高的占用CPU资源更多,但是并不意味着必须先将优先级高的运行完。由输出结果很明显看出线程threadB也在执行。