博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅谈JVM线程调度机制及主要策略
阅读量:4983 次
发布时间:2019-06-12

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

  在之前有说过线程,应该都知道,所谓线程就是进程中的一个子任务,一个进程有多个线程。今天的话主要就是谈一谈JVM线程调度机制。我们结合线程来说,当我们在做多线程的案例时,如一个经典案例,火车站卖票。

  * 下面附上代码:

/** * 需求:一个简单卖票程序    多个窗口卖票 * @ClassName:ThreadDemo3 * @author lxd * @date 2018年11月1日 * @version */public class ThreadDemo3 implements Runnable{    /** 车票 */    private int ticket;    public ThreadDemo3() {        this.ticket = 1000;    }    @Override    public void run() {        while(ticket > 0){            synchronized(this){                if(ticket > 0){                    try {                        // 线程进入暂时的休眠                        Thread.sleep(2);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                    // 获取到当前正在执行的程序的名称,打印票的余额                    System.out.println(Thread.currentThread().getName()+":正在执行操作,余票:"+ ticket--);                }            }        }    }}

   * 附上测试类代码:

/** * 测试卖票案例 * @ClassName:ThreadDemo3Test * @author lxd * @date 2018年11月1日 * @version */public class ThreadDemo3Test {    public static void main(String[] args) {        ThreadDemo3 demo3 = new ThreadDemo3();        Thread thread1 = new Thread(demo3);        Thread thread2 = new Thread(demo3);        Thread thread3 = new Thread(demo3);        Thread thread4 = new Thread(demo3);        thread1.start();        thread2.start();        thread3.start();        thread4.start();    }}

 

  * 通过上述可以看出我初始化火车票为1000张,然后定义了四个线程,同时去卖票。下面让我们来看看执行的结果。

 

  * 从上面的结果来看,我们可以看到线程2和线程1它们都执行了,也就是说这1000张票他们都参与进来执行,而不是某一个线程单独的任务。这也就是我要讲的第一个线程调度方式之一:抢占式调度。这种调度方式的好处,我相信通过上述的案例应该清晰一点了。抢占式调度他们是没有什么自主权的,他们的执行时间也都是由CPU来控制,这种调度机制最大的好吃就是,如果单独一个线程出现了阻塞,那么对于进程来将不会有太大影响。当然抢占式调度虽然说是完全依照CPU的意思,但是其实也是可以通过修改线程的优先级,来提升线程获取CPU执行权的机会。java中的线程优先级别主要分为10个级别。

 

  讲过了线程调度机制中的抢占式,那就还剩下一个协同式:协同式调度机制

  * 举个例子,生产者消费者模式中有一个案例,工厂机器生产牛奶,由员工对牛奶进行包装。一般流程就是,首先由生产机器先生产出牛奶,然后再通知员工去包装牛奶,如果当前还有牛奶没有被包装,那么机器将停止生产,需要等员工包装好以后,机器才继续生产。反之,当前如果没有生产好的牛奶,那么员工就不能去包装牛奶。这里面的流程就有了一个先后的执行顺序。这也就是我要讲的一个协同式调度,协同式调度的执行时间都是由线程自己决定,只有等到上一个线程执行完后,才通知对应的线程来执行。但是这样的话它的缺点就显而易见了,一旦其中一个线程出现了阻塞,那么整个进程也就阻塞了。

 

转载于:https://www.cnblogs.com/lxd-ld/p/9930534.html

你可能感兴趣的文章
R语言学习笔记之八
查看>>
正则表达式语法(msdn)
查看>>
oralce使用INSERT语句向表中插入数据
查看>>
MySQL 数据类型 详解 (转载)
查看>>
干净win7要做几步才能运行第一个Spring MVC 写的动态web程序
查看>>
Maven学习笔记(一)
查看>>
分割线
查看>>
xls的读写
查看>>
用函数创建子进程
查看>>
Myeclipse配置插件
查看>>
gitlab配置通过smtp发送邮件(QQ exmail腾讯企业为例)
查看>>
蓝桥杯之入学考试
查看>>
新公司java的注解以及springboot的相关注解
查看>>
Unity脚本的生命周期中几个重要的方法
查看>>
poj1552
查看>>
Thinkphp中文水印和图片水印合体集成插件
查看>>
FLASK安装--兼收EZ_INSTALL及PIP
查看>>
C++静态成员变量和静态成员函数小结
查看>>
Python---Flask--02--模板
查看>>
PHP学习笔记---封装(面向对象三大特性之一)
查看>>