线程的优先级(priority)决定了线程获得CPU运行的机会,优先级越高获得的运行机会越大,优先级越低获得的机会越小.Java的线程有10个级别(准确的说是11个级别,级别为0的线程是JVM,应用程序不能设置该级别)

那是不是级别为10的线程肯定比级别为9的线程优先运行呢?

看代码:

 1 public class Client {
 2     public static void main(String[] args){
 3         //启动20个不同优先级的线程
 4         for (int i = 0; i < 20; i++) {
 5             new TestThread().start(i % 10 + 1);
 6         }
 7
 8     }
 9 }
10
11 class TestThread implements Runnable {
12     //启动线程
13     public void start(int _priority) {
14         Thread t = new Thread(this);
15         //设置线程优先级
16         t.setPriority(_priority);
17         t.start();
18     }
19
20     @Override
21     public void run() {
22         //消耗CPU的计算,性能差的机器,请修改循环限制
23         for (int i = 0; i < 100000; i++) {
24             Math.hypot(Math.pow(924526789,i),Math.cos(i));
25         }
26         //输出线程优先级
27         System.out.println("Priority:" + Thread.currentThread().getPriority());
28
29     }
30 }

该多线程类实现了Runnable接口,实现了run方法,注意在run方法中有一个比较占用CPU的计算,该计算毫无意义,只是为了保证一个线程尽可能多的消耗CPU资源,目的是为了观察在CPU繁忙时,不同优先级线程的执行顺序.

需要说明的是,如果此处使用了Thread.sleep()方法,则不能体现出线程优先级的本质了,因为CPU并不繁忙,线程调度不会遵循优先级顺序来进行调度.

上面代码创建了20个线程,每个线程在运行时都耗尽了CPU资源,因为优先级不同,线程调度应该最先处理优先级最高的,然后处理优先级最低的,也就是先执行了2个优先级为10的线程,然后执行2个优先级为9的线程,2个优先级为8的线程....是结果并不是这样的...

运行结果:

Priority:10
Priority:7
Priority:1
Priority:8
Priority:3
Priority:6
Priority:3
Priority:2
Priority:4
Priority:8
Priority:9
Priority:9
Priority:10
Priority:2
Priority:6
Priority:7
Priority:5
Priority:5
Priority:4
Priority:1

println方法虽然有输出损耗,可能会影响到输出结果,但是不管运行多少次,都有两个不争的事实.

(1)并不是严格遵守线程优先级别来执行的.

  因为优先级只是代表获得CPU运行的机会,并不代表强制的排序号.

(2)优先级差别越大,运行机会差别越明显. 

  比如优先级为10的线程通常比优先级为2的线程先执行,但是优先级为6的线程和优先级为5的线程差别就不太明显了.

这连个现象是优先级的一个重要表现:

因为线程运行是要获得CPU资源的,谁能决定哪个线程先获得哪个线程后获得呢?

这是依照操作系统设定的线程优先级来分配的,每个线程需要运行,需要操作系统分配优先级和CPU资源,对Java来说,JVM调用操作系统的接口设置优先级,比如Windows操作系统是通过调用SetThreadPriority函数来设置的.

不同的操作系统线程的优先级是不相同的,Windows7个优先级,Linux有140个优先级,Freebsd则有255个(此处指的是优先级总数,不同操作系统有不同的分类,如中断线程,操作系统等级等,各个操作系统具体用户可用的线程数量也不相同).

Java是跨平台的系统,需要把10个优先级映射成不同操作系统的优先级,于是界定了Java的优先级只是代表抢占CPU的机会大小,优先级越高,抢占CPU的机会越大.被执行的可能性越高.

Java的缔造者们也发现了这个问题,于是在Thread类中设置了三个优先级,建议使用优先级常量,而不是1到10的随机数字.

public class Thread implements Runnable {/*** The minimum priority that a thread can have.*/public final static int MIN_PRIORITY = 1;/*** The default priority that is assigned to a thread.*/public final static int NORM_PRIORITY = 5;/*** The maximum priority that a thread can have.*/public final static int MAX_PRIORITY = 10;
}

建议使用这三个级别,不建议使用其他7个数字.

如果优先级相同,怎么办?

这也是由操作系统决定的,基本上是按照FIFO的原则,但是也不能完全保证.

[改善Java代码]线程优先级只使用三个等级相关推荐

  1. 改善Java代码有哪些方法?

    前言 Java是一门优秀的面向对象的编程语言,针对遇到同样的一个问题会有很多中解法哪种实现方法是最好的呢,还需要不断的探究JDK的底层原理.我会例出Java改善的建议哦,希望大家可以在平时开发工作去使 ...

  2. java 代码解析工具_改善 Java 代码质量的工具与方法

    原标题:改善 Java 代码质量的工具与方法 我们可能见过上面的有关代码质量的图片,究竟如何衡量一段代码好坏? 代码质量是什么?为什么它很重要? 作家通过他的著作来讲述了一个清晰的.令人信服的故事.他 ...

  3. [改善Java代码]适时选择不同的线程池来实现

    Java的线程池实现从最根本上来说只有两个:ThreadPoolExecutor类和ScheduledThreadPoolExecutor类,这两个类还是父子关系,但是Java为了简化并行计算,还提供 ...

  4. java最高线程优先级是,Java线程优先级

    详细内容 Java 线程优先级 Thread 类中,使用如下属性来代表优先级.private int priority; 我们可以通过 setPriority(int newPriority) 来设置 ...

  5. [改善Java代码]不使用stop方法停止线程

    线程启动完毕后,在运行可能需要终止,Java提供的终止方法只有一个stop,但是不建议使用此方法,因为它有以下三个问题: (1)stop方法是过时的 从Java编码规则来说,已经过时的方式不建议采用. ...

  6. [改善Java代码]用整数类型处理货币

    建议22:用整数类型处理货币. 1 public class Client { 2 public static void main(String[] args) { 3 System.out.prin ...

  7. Java不同场景加载不同类_[改善Java代码]不同的场景使用不同的泛型通配符

    Java泛型支持通配符(Wildcard),可以单独使用一个"?"表示任意类,也可以使用extends关键字标识某一类(接口)的子类型,还可以使用super关键字标识某一类(接口) ...

  8. [改善Java代码]不要主动进行垃圾回收

    建议51: 不要主动进行垃圾回收 很久很久以前,在Java 1.1的年代里,我们经常会看到System.gc这样的调用-主动对垃圾进行回收.不过,在Java知识深入人心后,这样的代码就逐渐销声匿迹了- ...

  9. [改善Java代码]使用valueOf前必须进行校验

    每个枚举都是java.lang.Enum的子类,都可以访问Enum类提供的方法,比如hashCode(),name(),valueOf()等..... 其中valueOf()方法会把一个String类 ...

最新文章

  1. Oracle感慨(转)
  2. 【干货】深入B端SaaS产品设计核心理念
  3. mysql的tcp链接过程_tcp建立连接和断开连接过程
  4. python代码质量检查工具_python代码检查工具pylint 让你的python更规范
  5. 用python做公众号网页_Python---微信公众号或网页自动导出
  6. Spring框架功能整体介绍
  7. 计算机网络训练参考文献,计算机网络实用技术教学方法的研究
  8. linux 从入参获取函数名字,C++ 函数名作为参数传递给另一个函数
  9. 自动驾驶汽车寿命只有四年?
  10. kubernetes(K8s):管理云平台中多个主机上的容器化的应用
  11. mysql分组查询学生平均年龄_mysql练习题
  12. java 工作流引擎调研总结
  13. 倒计时 妙味课堂_妙味课堂——JavaScript基础课程笔记
  14. 计算机专业英语第12章在线测试答案,计算机专业英语第章在线测试.doc
  15. word表格之跨页断行
  16. 数据标准化的原因及方法
  17. 怎么禁用笔记本触摸板
  18. 机器学习分类器——案例(opencv sklearn svm ann)
  19. linux设置网络唤醒
  20. 利用过滤器处理字符,解决中文乱码问题

热门文章

  1. volatile的用法
  2. 关于win2003服务器远程断开后自动注销的问题解决
  3. .Net Core使用视图组件(ViewComponent)封装表单文本框控件
  4. Java虚拟机常见面试题
  5. mysql语句中的sum(if(exp1,exp2,exp3))
  6. 记录计算顺子(12,3,4或者9,0,1,2)的方法
  7. jquery选择器,多个元素+除首个元素+出去首尾元素
  8. 1000亿个整数,请找出其中最大的100个
  9. 【查询】—Entity Framework实例详解
  10. 如何使Sybase ASE中对象名不区分大小写?