一、概述

在不同的JVM中(JVM也算是一个操作系统),有着不同的CPU调度算法,对于大部分的JVM来说,优先级也是调度算法中的一个参数。

所以,线程优先级在一定程度上,对线程的调度执行顺序有所影响,但不能用于保证线程的执行顺序,因为优先级仅仅是其中一个参数而已,其他参数还可能有线程的等待时间、执行时间等。而且操作系统也可抗能可以完全不用理会JAVA线程对于优先级的设定。

线程优先级的范围一般是1~10默认是5,但也有的JVM不是这个范围。所以,一般也尽量不要设置优先级为数字,可以使用Thread类的3个静态字段:

static int MAX_PRIORITY : 线程可以具有的最高优先级。
static int MIN_PRIORITY : 线程可以具有的最低优先级。
static int NORM_PRIORITY : 分配给线程的默认优先级。

同时。对于需要较多CPU时间的线程需要设置较低的优先级,这样可以确保处理器不会被独占。

二、实例应用

一直在思考怎么设计,才能用简单明了的例子来证明优先级对线程的执行顺序有影响,最后为了严谨,还是不得不用到线程锁,可能对初学者来说,有点难理解。

不过,思路是很清晰的:就是如何让10个线程一起同时并发。首先让创建的10个线程依次进入对象锁的池中等待,然后当10个线程创建完后,main线程(主线程)同时唤醒这10个线程,于是10个线程同时一起并发竞争CPU,只计算5次,看看线程的结束的先后顺序。(注意:之所以线程的执行次数限制在5次,而不是无限,是因为会发生线程饥饿,高优先级线程占用着CPU,导致低优先级的线程无法被调度!!

public class Test2 {//obj对象 用于作为对象锁static String obj="";
public static void main(String[] args) {//创建十个不同优先级的线程for(int i=1;i<10;i++){Thread t = new Thread(new Task(),"Thread_"+i);t.setPriority(i);//线程启动,进入就绪队列t.start();try {//当前线程--main线程 休眠100毫秒,确保线程t已经创建完成,并能运行到等待获取锁处Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}synchronized (obj) {//main线程获取对象锁后,唤醒等待在该对象池上的所有线程--就是上面创建的10个线程obj.notifyAll();}}
}//实现 Runnable接口class Task implements Runnable{@Overridepublic void run() {synchronized (Test2.obj) {try {//在对象Test2.obj上等待,Test2.obj.wait();} catch (InterruptedException e) {e.printStackTrace();}}//线程唤醒后,执行下面的代码int count=0;//计算5次,不能是while(true),不限制执行次数,否则会发生线程饥饿while(count<5){count++;System.out.println(Thread.currentThread().getName());//每次计算完后,让出CPU,重新进入就绪队列,与其他线程一起竞争CPUThread.yield();}System.out.println(Thread.currentThread().getName()+"结束");}}

测试结果:

  从结果可以看出,虽然线程的结束顺序不是完全按照优先级高低,但也基本是优先级高的线程结束的较快,被CPU调度的概率越大

Thread_9
Thread_5
Thread_6
Thread_8
Thread_7
Thread_9
Thread_8
Thread_7
Thread_9
Thread_8
Thread_9
Thread_7
Thread_9
Thread_7
Thread_8
Thread_9结束
Thread_8
Thread_7
Thread_8结束
Thread_7结束
Thread_4
Thread_5
Thread_6
Thread_3
Thread_5
Thread_6
Thread_5
Thread_6
Thread_5
Thread_6
Thread_5结束
Thread_6结束
Thread_4
Thread_2
Thread_3
Thread_4
Thread_1
Thread_3
Thread_4
Thread_3
Thread_4
Thread_3
Thread_4结束
Thread_3结束
Thread_2
Thread_1
Thread_2
Thread_1
Thread_2
Thread_1
Thread_2
Thread_1
Thread_1结束
Thread_2结束

文章有不当之处,欢迎指正,你也可以关注我的微信公众号:好好学java,获取优质学习资源。

并发基础(三): java线程优先级小试牛刀相关推荐

  1. 了解Java线程优先级,更要知道对应操作系统的优先级,不然会踩坑

    Java 多线程系列第 6 篇. 这篇我们来看看 Java 线程的优先级. Java 线程优先级 Thread 类中,使用如下属性来代表优先级. private int priority; 我们可以通 ...

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

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

  3. Java并发指南1:并发基础与Java多线程

    什么是并发 在过去单CPU时代,单任务在一个时间点只能执行单一程序.之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程.虽然并不是真正意义上的"同一时间点",而是多个 ...

  4. 高并发基础之Java并发包

    转自:https://my.oschina.net/hosee/blog/607677 其他资料: https://my.oschina.net/zhupanxin/blog/269037 摘要: 本 ...

  5. Java基础之——Java 线程

    Java 线程 1.创建线程类(方法一) Java使用 java.lang.Thread 类代表线程,所有的线程对象都必须是 Thread 类或其子类的实例.每个线程的作用是完成一定的任务,实际上就是 ...

  6. JUC并发编程之Java线程(二)

    二.Java线程 2.1 创建和运行线程 方法一:Thread创建线程方式: 继承Thread类 匿名内部类方式 public class CreateThread01 {public static ...

  7. What is Java thread priority? 什么是java线程优先级

    就一个小程序,运行一次输出结果不一样,这是因为线程调度方法不能确定,取决你当前操作系统的进程,线程调度优先级. 所以要想线程按一定的顺序运行,哪么只能选择Synchronized 互斥(对象锁)和 w ...

  8. Java面试系列之并发编程专题-Java线程池灵魂拷问

    金三银四跳槽季即将来临,想必有些猿友已经蠢蠢欲动在做相关的准备了!在接下来的日子里,笔者将坚持写作.分享Java工程师在面试求职期间的方方面面,包括简历制作.面试场景复现.面试题解答.谈薪技巧 以及 ...

  9. Java线程优先级与CPU执行机制

    跟着作者的65节课彻底搞懂Java并发原理专栏,一步步彻底搞懂Java并发原理. 作者简介:笔名seaboat,擅长工程算法.人工智能算法.自然语言处理.架构.分布式.高并发.大数据和搜索引擎等方面的 ...

最新文章

  1. ios 沙盒 plist 数据的读取和存储
  2. hadoop作业初始化过程详解(源码分析第三篇)
  3. Android TV 悬浮球模拟物理按键
  4. PHP保存Base64图片的问题
  5. Gradle增量编译(六)
  6. android电话系统,Android电话系统之-rild.doc
  7. 今天闲来无事,做了个简易的ORM 感觉有点像ActiveRecord作业风格,又有点像iBatis...
  8. 球体积公式计算4/3PIr*r*r,编写一个程序输入半径,求体积
  9. 拍拍熊(APT-C-37),诱导方式、DNS、安卓远控
  10. python缩减数据
  11. cogs——2098. Asm.Def的病毒
  12. 键盘哪个键是锁定计算机,笔记本键盘锁定键在哪_笔记本电脑的“键盘锁”是哪一个键-win7之家...
  13. Android全局捕获异常信息,并上传到服务器。
  14. 百分点感知智能实验室:计算机视觉理论和应用研究
  15. 第一章 企业管理概论
  16. 【转】小生我怕怕工具包[2010.06.17](转自52破解论坛)
  17. 硬盘分类(HDD、HHD、SSD)简介
  18. 电容笔和触控笔有什么区别?ipad手写电容笔推荐品牌
  19. 国足历届世界杯对战图关系
  20. 食品卡路里是如何计算出来的?

热门文章

  1. SAP BDC 技术的分类(转)
  2. Centos7:查看某个端口被哪个进程占用
  3. vivox3android系统,vivo X3手机系统是什么 vivo X3手机能升级安卓4.3
  4. chap10 构建Web内容的技术
  5. 2021中青杯数学建模C题 在线教学的分析与研究
  6. Crypto-Danciling line.(ascii 图像
  7. python—多进程之进程的创建(一)
  8. optee运行时来了一个REE(linux)中断--代码导读
  9. HTML头部元素标签
  10. VScode Python插件