在之前有说过线程,应该都知道,所谓线程就是进程中的一个子任务,一个进程有多个线程。今天的话主要就是谈一谈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个级别。

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

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

浅谈JVM线程调度机制及主要策略的更多相关文章

  1. 浅谈jvm中的垃圾回收策略

    下面小编就为大家带来一篇浅谈jvm中的垃圾回收策略.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧   java和C#中的内存的分配和释放都是由虚拟机自动管理的,此前我已 ...

  2. 浅谈JVM垃圾回收

    JVM内存区域 要想搞懂啊垃圾回收机制,首先就要知道垃圾回收主要回收的是哪些数据,这些数据主要在哪一块区域. Java8和Java8之前的相同点有很多. 都有虚拟机栈,本地方法栈,程序计数器,这三个是 ...

  3. 浅谈java发射机制

    目录 什么是反射 初探 初始化 类 构造函数 属性 方法 总结 思考 什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意 ...

  4. 浅谈java内存分配和回收策略

    一.导论 java技术体系中所提到的内存自动化管理归根结底就是内存的分配与回收两个问题,之前已经和大家谈过java回收的相关知识,今天来和大家聊聊java对象的在内存中的分配.通俗的讲,对象的内存分配 ...

  5. 浅谈java反射机制

    目录 什么是反射 初探 初始化 类 构造函数 属性 方法 总结 思考 什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意 ...

  6. 浅谈JVM内存分配与垃圾回收

    大家好,我是微尘,最近又去翻了周志明老师的<深入理解Java虚拟机>这本书.已经看了很多遍了,每次都感觉似乎看懂了,但没过多久就忘了.这次翻了第三章的垃圾收集器与内存分配策略,感觉有了新的 ...

  7. 浅谈java编译机制和运行机制

    源文件和字节码的组成方式 源文件: 拓展名后跟java的文件即java的源文件. Java 源码编译由以下三个过程组成: 1.分析和输入到符号表 2.注解处理 3.语义分析和生成class文件 流程图 ...

  8. 浅谈JVM内存模型

    JAVA虚拟机在执行JAVA程序的时候,会把它管理的内存分成若干不同的数据区域,每个区域都有各自的用途.目前大致把JVM内存模型划分为五个区域:程序计数器,虚拟机栈,本地方法栈,堆和方法区. 程序计数 ...

  9. 浅谈 JVM 结构体系、类加载、JDK JRE JVM 三者的关系

    一.java类,创建.编译.到运行的工程: 1.随便建一个Java类,保存后就是一个.java文件, 2.然后我们使用 javac命令编译 .java文件,生产 .class文件. 3.再然后使用 j ...

随机推荐

  1. 【降维】主成分分析PCA推导

    本博客根据 百面机器学习,算法工程师带你去面试 一书总结归纳,公式都是出自该书. 本博客仅为个人总结学习,非商业用途,侵删. 网址 http://www.ptpress.com.cn 目录: PCA最 ...

  2. 代理模式之静态代理,JDK动态代理和cglib动态代理

    代理模式,顾名思义,就是通过代理去完成某些功能.比如,你需要购买火车票,不想跑那么远到火车站售票窗口买,可以去附近的火车票代售点买,或者到携程等第三方网站买.这个时候,我们就把火车站叫做目标对象或者委 ...

  3. Preparing for the interview of FLAG and USDA

    7,Dynamic Programming 1,Unique Paths A robot is located at the top-left corner of a m x n grid (mark ...

  4. 关于c++的头文件和变量声明

    写再最前面:摘录于柳神的笔记:   C++的头⽂件⼀般是没有像C语⾔的 .h 这样的扩展后缀的,⼀般情况下C语⾔⾥⾯的头⽂件去掉 .h 然 后在前⾯加个 c 就可以继续在C++⽂件中使⽤C语⾔头⽂件中 ...

  5. Duilib XML嵌套/自定义控件

    转载:https://www.jianshu.com/p/0fe8610dcc8d  // https://github.com/Washington-DC/Duilib-ListView  //这是 ...

  6. 各种STL的基本用法

    目录 STL及一些常用函数的基本用法 1.vector(向量)的基本用法 2.queue(队列)的基本用法 3.stack(栈)的基本操作 4.set(集合)的基本用法 5.map(映射)的基本用法 ...

  7. Spark入门:第2节 Spark集群安装:1 - 3;第3节 Spark HA高可用部署:1 - 2

    三. Spark集群安装 3.1 下载spark安装包 下载地址spark官网:http://spark.apache.org/downloads.html 这里我们使用 spark-2.1.3-bi ...

  8. C++11常用特性介绍——auto类型修饰符

    1.C++11常用特性介绍 从本篇开始介绍C++11常用特性,大致分:关键字及新语法.STL容器.多线程.智能指针内存管理,最后讲一下std::bind和std::function 二.关键字和新语法 ...

  9. springboot之快速创建项目

    1.选择创建新项目: 2.选择spring initializr,然后next 3.填写项目元数据,然后next 4.选择项目依赖,然后next 5.点击finish,完成项目创建

  10. C++ class without pointer members

      写在前面 Object Oriented class 的分类:带指针的class和不带指针的class, class 的声明         这里有一个inline的概念,写在类里面的默认为inl ...