java线程优先级设置,java线程优先级有几级

  java线程优先级设置,java线程优先级有几级

  如何解决写爬虫IP受阻的问题?立即使用。

  Java 线程优先级

  在Thread类中,以下属性用于表示优先级。

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

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

  公共静态void main(String[] args) {

  Thread thread=新线程();

  system . out . println(thread . get priority());

  }

  //打印结果:5。其实这是一个很大的错误,只是看到了表面。看下面这个例子。我们把当前线程的优先级改成了4,发现子线程thread的优先级也是4。

  公共静态void main(String[] args) {

  Thread.currentThread()。set priority(4);

  Thread thread=新线程();

  system . out . println(thread . get priority());

  }

  //打印结果:4这是当头一棒。如果是线程,默认优先级是5。我们新创建的线程Thread,没有设置优先级,应该是5,但实际上是4。我们来看看线程初始化优先级的源代码。

  thread parent=currentThread();

  this . priority=parent . get priority();最初,线程的默认优先级是继承父线程的优先级。在上面的例子中,我们将父线程的优先级设置为4,所以子线程的优先级也变成了4。

  严格来说,子线程的默认优先级和父线程是一样的,Java主线程的默认优先级是5。

  Java中定义了三种优先级,分别是最低优先级(1)、普通优先级(5)和最高优先级(10)。代码如下。Java优先级范围是[1,10],设置其他数字的优先级会抛出IllegalArgumentException异常。

  /**

  *线程可以拥有的最低优先级。

  */

  public final static int MIN _ PRIORITY=1;

  /**

  *分配给线程的默认优先级。

  */

  public final static int NORM _ PRIORITY=5;

  /**

  *线程可以拥有的最高优先级。

  */

  public final static int MAX _ PRIORITY=10;接下来,我们来说说线程优先级的作用。先看下面的代码。代码的逻辑是创建3000个线程,即1000个优先级为1的线程、1000个优先级为5的线程和1000个优先级为10的线程。MinTimes用于记录1000个MIN_PRIORITY线程运行时时间戳的总和,normTimes用于记录1000个NORM_PRIORITY线程运行时时间戳的总和,maxTimes用于记录1000个MAX_PRIORITY线程运行时时间戳的总和。通过统计每个优先级操作的时间戳之和,值越小,执行的优先级越高。我们跑去看看吧。

  公共类TestPriority {

  static atomic long min times=new atomic long(0);

  static atom clong norm times=new atom clong(0);

  static AtomicLong max times=new AtomicLong(0);

  公共静态void main(String[] args) {

  ListMyThread minThreadList=new ArrayList();

  ListMyThread normThreadList=new ArrayList();

  ListMyThread maxThreadList=new ArrayList();

  int count=1000

  for(int I=0;我数;i ) {

  MyThread MyThread=new MyThread( min- I);

  myThread.setPriority(线程。MIN _ PRIORITY);

  minthreadlist . add(myThread);

  }

  for(int I=0;我数;i ) {

  MyThread MyThread=new MyThread( norm- I);

  myThread.setPriority(线程。NORM _ PRIORITY);

  norm threadlist . add(myThread);

  }

  for(int I=0;我数;i ) {

  MyThread MyThread=new MyThread( max- I);

  myThread.setPriority(线程。MAX _ PRIORITY);

  maxthreadlist . add(myThread);

  }

  for(int I=0;我数;i ) {

  maxThreadList.get(i)。start();

  normThreadList.get(i)。start();

  minThreadList.get(i)。start();

  }

  尝试{

  thread . sleep(3000);

  } catch (InterruptedException e) {

  e . printstacktrace();

  }

  系统。出去。println(最高优先级统计:最大次数。get());

  系统。出去。println(标准优先级统计:“正常时间。get());

  minPriority统计:最小次数。get());

  System.out.println(普通优先级与最高优先级相差时间:(规范倍。get()-最大次数。get()) ms );

  System.out.println(最低优先级与普通优先级相差时间:(最小次数。get()-norm倍。get()) ms );

  }

  静态类神话故事扩展线程{

  公共MyThread(字符串名称){

  超级(名);

  }

  @覆盖

  公共无效运行(){

  系统。出去。println(这个。getname() priority: this。getpriority());

  switch (this.getPriority()) {

  案件线索。最高优先级:

  最大次数。getandadd(系统。当前时间毫秒());

  打破;

  案件线索100 . NORM _优先级:

  正常时间。getandadd(系统。当前时间毫秒());

  打破;

  案件线索。最小优先级:

  最小次数。getandadd(系统。当前时间毫秒());

  打破;

  默认值:

  打破;

  }

  }

  }

  }执行结果如下:

  # 第一部分

  最大- 0优先级:10

  norm - 0优先级:5

  最大一优先级:10

  最大- 2优先级:10

  规范- 2优先级:5

  最小- 4优先级:1

  .

  马克斯- 899优先级:10

  最小912优先级:1

  最小847优先级:5

  最小883优先级:1

  # 第二部分

  最大优先级统计:1568986695523243

  非优先性统计:1568986695526080

  minPriority统计:1568986695545414

  普通优先级与最高优先级相差时间:2837毫秒

  最低优先级与普通优先级相差时间:19334毫秒我们一起来分析一下结果。先看看第一部分,最开始执行的线程高优先级、普通优先级、低优先级都有,最后执行的线程也都有各个优先级的,这说明了:优先级高的线程不代表一定比优先级低的线程优先执行。也可以换另一种说法:代码执行顺序跟线程的优先级无关。看看第二部分的结果,我们可以发现最高优先级的1000 个线程执行时间戳之和最小,而最低优先级的1000 个线程执行时间戳之和最大,因此可以得知:一批高优先级的线程会比一批低优先级的线程优先执行,即高优先级的线程大概率比低优先的线程优先获得中央处理器资源。

  各操作系统中真有 10 个线程等级么?

  爪哇作为跨平台语言,线程有10 个等级,但是映射到不同操作系统的线程优先级值不一样。接下来教大家怎么在OpenJDK源码中查各个操作系统中线程优先级映射的值。

  看到线源代码,设置线程优先级最终调用了本地方法设置优先级0();

  private native void set priority 0(int new priority);接着我们在OpenJDK的线程。c代码中找到setPriority0()对应的方法JVM _ SetThreadPriority

  静态JNINativeMethod方法[]={

  .

  {setPriority0 ,(I)V ,(void *)JVM_SetThreadPriority},

  .};我们根据JVM_SetThreadPriority找到虚拟机。卡片打印处理机(Card Print Processor的缩写)中对应的代码段;

  JVM_ENTRY(void,JVM _ SetThreadPriority(JNIEnv * env,jobject jthread,jint prio))

  JVM包装( JVM _ SetThreadPriority );

  //确保C线程和OSThread结构在我们操作之前没有被释放

  互斥锁ml(Threads _ lock);

  OOP Java _ thread=JNI句柄:resolve _ non _ null(jthread);

  Java _ lang _ Thread:set _ priority(Java _ Thread,(线程优先级)prio);

  Java Thread * thr=Java _ lang _ Thread:Thread(Java _ Thread);

  如果(thr!=NULL) { //线程尚未启动;当优先级降低时

  Thread:set_priority(thr,(线程优先级)prio);

  }

  JVM _结束根据第3步中的代码,我们可以发现关键是java_lang_Thread:set_Priority()这段代码,继续找线程。卡片打印处理机(Card Print Processor的缩写)代码中的set_Priority()方法;

  void线程:set _ priority(线程*线程,线程优先级优先级){

  跟踪(设置优先级,线程);

  debug _ only(check _ for _ dangling _ thread _ pointer(thread);)

  //可以返回错误!

  (void)os:set_priority(线程,优先级);

  }以上就是爪哇线程优先级的详细内容,更多请关注我们其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: