专栏首页好好学java的技术栈并发基础(三): java线程优先级小试牛刀

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

一、概述

多线程的优先级,小伙伴们应该都或多或少的用过或者见到过,但是,对于具体用法可能还是有点不太清楚,这篇文章就对这个问题进行一个探讨,也欢迎小伙伴们一起留言讨论。

在不同的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,导致低优先级的线程无法被调度!!

 1public class Test2 {
 2    //obj对象 用于作为对象锁
 3    static String obj="";
 4public static void main(String[] args) {
 5   //创建十个不同优先级的线程
 6   for(int i=1;i<10;i++){
 7       Thread t = new Thread(new Task(),"Thread_"+i);
 8       t.setPriority(i);
 9       //线程启动,进入就绪队列
10       t.start();
11       try {
12       //当前线程--main线程 休眠100毫秒,确保线程t已经创建完成,并能运行到等待获取锁处
13        Thread.sleep(100);
14    } catch (InterruptedException e) {
15        e.printStackTrace();
16    }
17   }
18   synchronized (obj) {
19       //main线程获取对象锁后,唤醒等待在该对象池上的所有线程--就是上面创建的10个线程
20       obj.notifyAll();
21   }
22}
23}
24  //实现 Runnable接口
25  class Task implements Runnable{
26    @Override
27    public void run() {
28        synchronized (Test2.obj) {
29            try {
30                //在对象Test2.obj上等待,
31                Test2.obj.wait();
32            } catch (InterruptedException e) {
33                e.printStackTrace();
34            }
35        }
36        //线程唤醒后,执行下面的代码
37        int count=0;
38        //计算5次,不能是while(true),不限制执行次数,否则会发生线程饥饿
39        while(count<5){
40            count++;
41            System.out.println(Thread.currentThread().getName());
42            //每次计算完后,让出CPU,重新进入就绪队列,与其他线程一起竞争CPU
43            Thread.yield();
44        }
45        System.out.println(Thread.currentThread().getName()+"结束");
46    }
47  }

测试结果:

  从结果可以看出,虽然线程的结束顺序不是完全按照优先级高低,但也基本是优先级高的线程结束的较快,被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(SIHAIloveJAVA)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-06-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • java并发基础篇(五): 创建线程的四种方式

    在详细了解这四种方法之前,先来理解一下为什么线程要这样创建:形象点来说,Thread是一个工人,run()方法里面的便是他的任务栏,这个任务栏默认是空的。当你想...

    好好学java
  • 七夕不送礼,送礼就送HttpServletResponse,一看就懂

    Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。获取网页提交过来的数据,...

    好好学java
  • SQL 查询总是先执行SELECT语句吗?你们都错了!

    很多 SQL 查询都是以 SELECT 开始的。不过,最近我跟别人解释什么是窗口函数,我在网上搜索”是否可以对窗口函数返回的结果进行过滤“这个问题,得出的结论是...

    好好学java
  • [javaSE] 看博客学习多线程的创建方式和优劣比较和PHP多线程

    Runnable是一个接口,定义一个类MyRunnable实现Runnable接口,实现run()方法,

    陶士涵
  • ReentrantLock实现原理

    建议和上一篇分享结合着看:深入理解AbstractQueuedSynchronizer

    Java识堂
  • 深度理解volatile关键字

    volatile不是线程安全的,他只能保证变量的可见性,无法保证其原子性,如果设置的时候采用运算方式,那么将无法保证线程安全

    彼岸舞
  • 某团面试题:JVM 堆内存溢出后,其他线程是否可继续工作?

    最近网上出现一个美团面试题:“一个线程OOM后,其他线程还能运行吗?”。我看网上出现了很多不靠谱的答案。这道题其实很有难度,涉及的知识点有jvm内存分配、作用域...

    芋道源码
  • 面试|再次讲解Threadlocal使用及其内存溢出

    浪尖整理本文主要是想帮助大家完全消化面试中常见的ThreadLocal问题。希望读懂此文以后大家可以掌握(没耐心的可以直接阅读底部总结):

    Spark学习技巧
  • 某团面试题:JVM 堆内存溢出后,其他线程是否可继续工作?

    最近网上出现一个美团面试题:“一个线程OOM后,其他线程还能运行吗?”。我看网上出现了很多不靠谱的答案。这道题其实很有难度,涉及的知识点有jvm内存分配、作用域...

    乔戈里
  • CountDownLatch 源码分析

    CountDownLatch 源码分析 1. 在阅读源码时做了大量的注释,并且做了一些测试分析源码内的执行流程,由于博客篇幅有限,并且代码阅读起来没有 IDE...

    lwen

扫码关注云+社区

领取腾讯云代金券