Java线程优先级是什么

  介绍

小编给大家分享一下Java线程优先级是什么,希望大家阅读完这篇文章后大所收获、下面让我们一起去探讨吧!

<强> Java线程优先级

线程类中,使用如下属性来代表优先级。

私人int优先;

我们可以通过setPriority (int newPriority)来设置新的优先级,通过getPriority()来获取线程的优先级。

有些资料通过下面的例子就得出了一个结论:Java线程默认优先级是5 .

公共静态void main (String [] args) {   线程的线程=新线程();   System.out.println (thread.getPriority ());   }//打印结果:5

其实这是大错特错的,只是看到了表面,看看下面的例子,我们把当前线程的优先级改为4,发现子线程线程的优先级也是4 .

公共静态void main (String [] args) {   Thread.currentThread () .setPriority (4);   线程的线程=新线程();   System.out.println (thread.getPriority ());   }//打印结果:4

这啪啪啪打脸了,如果是线程默认优先级是5,我们新创建的螺纹线程,没设置优先级,理应是5,但实际是4。我们看看线程初始化优先级的源代码。

线程父母=currentThread ();   这一点。优先级=parent.getPriority ();

原来,线程默认的优先级是继承父线程的优先级,上面例子我们把父线程的优先级设置为4,所以导致子线程的优先级也变成4 .

严谨一点说,子线程默认优先级和父线程一样,Java主线程默认的优先级是5 .

Java中定义了3种优先级,分别是最低优先级(1),正常优先级(5),最高优先级(10)代码如下所示. Java优先级范围是[1,10],设置其他数字的优先级都会抛出IllegalArgumentException异常。

/* *   *最低优先级线程。   */最后公共静态int MIN_PRIORITY=1;/* *   *分配给线程的默认优先级。   */最后公共静态int NORM_PRIORITY=5;/* *   *一个线程的最大优先级。   */最后公共静态int MAX_PRIORITY=10;

接下来说说线程优先级的作用,先看下面代码,代码逻辑是创建了3000个线程,分别是:1000个优先级为1的线程,1000个优先级为5的线程,1000个优先级为10的线程。用minTimes来记录1000个MIN_PRIORITY线程运行时时间戳之和,用normTimes来记录1000个NORM_PRIORITY线程运行时时间戳之和,用maxTimes来记录1000个MAX_PRIORITY线程运行时时间戳之和。通过统计每个优先级的运行的时间戳之和,值越小代表的就是越优先执行。我们运行看看。

公共类TestPriority {   静态AtomicLong minTimes=new AtomicLong (0);   静态AtomicLong normTimes=new AtomicLong (0);   静态AtomicLong maxTimes=new AtomicLong (0);      公共静态void main (String [] args) {   List,minThreadList=new ArrayList<的在();   List,normThreadList=new ArrayList<的在();   List,maxThreadList=new ArrayList<的在();      int数=1000;   for (int i=0;我& lt;计数;我+ +){   MyThread MyThread=new MyThread (“min - - - - -“+ i);   myThread.setPriority (Thread.MIN_PRIORITY);   minThreadList.add (myThread);   }   for (int i=0;我& lt;计数;我+ +){   MyThread MyThread=new MyThread(“规范——产生绯闻;+ i);   myThread.setPriority (Thread.NORM_PRIORITY);   normThreadList.add (myThread);   }   for (int i=0;我& lt;计数;我+ +){   MyThread MyThread=new MyThread (max - - - - -“;+ i);   myThread.setPriority (Thread.MAX_PRIORITY);   maxThreadList.add (myThread);   }      for (int i=0;我& lt;计数;我+ +){   maxThreadList.get (i) .start ();   normThreadList.get (i) .start ();   minThreadList.get (i) .start ();   }      尝试{   thread . sleep (3000);   }捕捉(InterruptedException e) {   e.printStackTrace ();   }      System.out.println (“maxPriority统计:“;+ maxTimes.get ());   System.out.println (“normPriority统计:“;+ normTimes.get ());   System.out.println (“minPriority统计:“;+ minTimes.get ());   System.out.println(“普通优先级与最高优先级相差时间:“+ (normTimes.get ()——maxTimes.get ()) +“ms");   System.out.println(“最低优先级与普通优先级相差时间:“+ (minTimes.get ()——normTimes.get ()) +“ms");      }      静态类MyThread延伸线{      公共MyThread(字符串名称){   超级(名称);   }      @Override   公共空间run () {   System.out.println (this.getName () +“;优先级:“;+ this.getPriority ());   开关(this.getPriority ()) {   情况下线程。MAX_PRIORITY:   maxTimes.getAndAdd (System.currentTimeMillis ());   打破;   情况下线程。NORM_PRIORITY:   normTimes.getAndAdd (System.currentTimeMillis ());   打破;   情况下线程。MIN_PRIORITY:   minTimes.getAndAdd (System.currentTimeMillis ());   打破;   默认值:   打破;   }   }   }   }

Java线程优先级是什么