博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[改善Java代码]线程优先级只使用三个等级
阅读量:6789 次
发布时间:2019-06-26

本文共 2560 字,大约阅读时间需要 8 分钟。

线程的优先级(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     @Override21     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:10Priority:7Priority:1Priority:8Priority:3Priority:6Priority:3Priority:2Priority:4Priority:8Priority:9Priority:9Priority:10Priority:2Priority:6Priority:7Priority:5Priority:5Priority:4Priority: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的原则,但是也不能完全保证.

 

转载于:https://www.cnblogs.com/DreamDrive/p/5623826.html

你可能感兴趣的文章
centos7安装docker镜像源管理工具harbor
查看>>
vim工具的编辑模式及命令模式
查看>>
DevExpress v17.2新版亮点——Data Access
查看>>
Java Script 第七节课 Java Script的逻辑运算符的例子
查看>>
CSS 3 伪类选择器
查看>>
swfit学习函数
查看>>
UML状态机
查看>>
Java过滤器,SpringMVC拦截器之间的一顺序点关系
查看>>
决心书
查看>>
linux系统管理之存储管理
查看>>
组播RPF 逆向路径转发 实验原理
查看>>
Centos 定时重启 Tomcat
查看>>
java i++
查看>>
linux运维基础篇 unit10
查看>>
linux运维基础篇 unit12
查看>>
俯身倾耳以请
查看>>
程序猿们_你是从头学起_还是半路出家的
查看>>
关于缓存的基础概念
查看>>
智能合约语言 Solidity 教程系列8 - Solidity API
查看>>
机器学习、深度学习、和AI算法可以在网络安全中做什么?
查看>>