[改善Java代码]线程优先级只使用三个等级
线程的优先级(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代码]线程优先级只使用三个等级相关推荐
- 改善Java代码有哪些方法?
前言 Java是一门优秀的面向对象的编程语言,针对遇到同样的一个问题会有很多中解法哪种实现方法是最好的呢,还需要不断的探究JDK的底层原理.我会例出Java改善的建议哦,希望大家可以在平时开发工作去使 ...
- java 代码解析工具_改善 Java 代码质量的工具与方法
原标题:改善 Java 代码质量的工具与方法 我们可能见过上面的有关代码质量的图片,究竟如何衡量一段代码好坏? 代码质量是什么?为什么它很重要? 作家通过他的著作来讲述了一个清晰的.令人信服的故事.他 ...
- [改善Java代码]适时选择不同的线程池来实现
Java的线程池实现从最根本上来说只有两个:ThreadPoolExecutor类和ScheduledThreadPoolExecutor类,这两个类还是父子关系,但是Java为了简化并行计算,还提供 ...
- java最高线程优先级是,Java线程优先级
详细内容 Java 线程优先级 Thread 类中,使用如下属性来代表优先级.private int priority; 我们可以通过 setPriority(int newPriority) 来设置 ...
- [改善Java代码]不使用stop方法停止线程
线程启动完毕后,在运行可能需要终止,Java提供的终止方法只有一个stop,但是不建议使用此方法,因为它有以下三个问题: (1)stop方法是过时的 从Java编码规则来说,已经过时的方式不建议采用. ...
- [改善Java代码]用整数类型处理货币
建议22:用整数类型处理货币. 1 public class Client { 2 public static void main(String[] args) { 3 System.out.prin ...
- Java不同场景加载不同类_[改善Java代码]不同的场景使用不同的泛型通配符
Java泛型支持通配符(Wildcard),可以单独使用一个"?"表示任意类,也可以使用extends关键字标识某一类(接口)的子类型,还可以使用super关键字标识某一类(接口) ...
- [改善Java代码]不要主动进行垃圾回收
建议51: 不要主动进行垃圾回收 很久很久以前,在Java 1.1的年代里,我们经常会看到System.gc这样的调用-主动对垃圾进行回收.不过,在Java知识深入人心后,这样的代码就逐渐销声匿迹了- ...
- [改善Java代码]使用valueOf前必须进行校验
每个枚举都是java.lang.Enum的子类,都可以访问Enum类提供的方法,比如hashCode(),name(),valueOf()等..... 其中valueOf()方法会把一个String类 ...
最新文章
- Oracle感慨(转)
- 【干货】深入B端SaaS产品设计核心理念
- mysql的tcp链接过程_tcp建立连接和断开连接过程
- python代码质量检查工具_python代码检查工具pylint 让你的python更规范
- 用python做公众号网页_Python---微信公众号或网页自动导出
- Spring框架功能整体介绍
- 计算机网络训练参考文献,计算机网络实用技术教学方法的研究
- linux 从入参获取函数名字,C++ 函数名作为参数传递给另一个函数
- 自动驾驶汽车寿命只有四年?
- kubernetes(K8s):管理云平台中多个主机上的容器化的应用
- mysql分组查询学生平均年龄_mysql练习题
- java 工作流引擎调研总结
- 倒计时 妙味课堂_妙味课堂——JavaScript基础课程笔记
- 计算机专业英语第12章在线测试答案,计算机专业英语第章在线测试.doc
- word表格之跨页断行
- 数据标准化的原因及方法
- 怎么禁用笔记本触摸板
- 机器学习分类器——案例(opencv sklearn svm ann)
- linux设置网络唤醒
- 利用过滤器处理字符,解决中文乱码问题
热门文章
- volatile的用法
- 关于win2003服务器远程断开后自动注销的问题解决
- .Net Core使用视图组件(ViewComponent)封装表单文本框控件
- Java虚拟机常见面试题
- mysql语句中的sum(if(exp1,exp2,exp3))
- 记录计算顺子(12,3,4或者9,0,1,2)的方法
- jquery选择器,多个元素+除首个元素+出去首尾元素
- 1000亿个整数,请找出其中最大的100个
- 【查询】—Entity Framework实例详解
- 如何使Sybase ASE中对象名不区分大小写?