在之前有说过线程,应该都知道,所谓线程就是进程中的一个子任务,一个进程有多个线程。今天的话主要就是谈一谈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. 小白学 Python 爬虫:Selenium 获取某大型电商网站商品信息

    目标 先介绍下我们本篇文章的目标,如图: 本篇文章计划获取商品的一些基本信息,如名称.商店.价格.是否自营.图片路径等等. 准备 首先要确认自己本地已经安装好了 Selenium 包括 Chrome ...

  2. JavaScript - __proto__和prototype,原形

    参考 https://stackoverflow.com/questions/9959727/proto-vs-prototype-in-javascript 区别 构造函数中的prototype创建 ...

  3. Python回收机制

    1.小整数对象池 整数在程序中的使用非常广泛,python 为了优化速度,使用了小整数对象池,避免整数频繁申请和销毁和内存空间. Python 对小整数的定义事[-5, 257]这些整数对象的hi提前 ...

  4. HashMap与HashTable源码学习及效率比较分析

    一.个人学习后的见解: 首先表明学习源码后的个人见解,后续一次依次进行分析: 1.线程安全:HashMap是非线程安全的,HashTable是线程安全的(HashTable中使用了synchroniz ...

  5. 【剑指Offer面试编程题】题目1356:孩子们的游戏(圆圈中最后剩下的数)--九度OJ

    题目描述: 每年六一儿童节,JOBDU都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为JOBDU的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈. ...

  6. 【剑指Offer面试编程题】题目1355:扑克牌顺子--九度OJ

    题目描述: LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他 ...

  7. Spring 中 bean 的生命周期?

    参考:https://www.cnblogs.com/kenshinobiy/p/4652008.html Spring Bean 生命周期如下: 1:Bean的建立: 容器寻找Bean的定义信息并将 ...

  8. Java面向对象编程 -1.2

    类与对象简介 类是某一类事物的共性的抽象概念 而对象描述的是一个具体的产物 类是一个模板,而对象才是类可以使用的实例,先有类再有对象 在类之中一般都会有两个组成: 成员属性(Filed) :有些时候为 ...

  9. Linux命令:yum命令

    YUM: Yellowdog Update Modifier,rpm的前端程序,可解决软件包相关依赖性,可在多个库之间定位软件包,up2date的替代工具 一.yum命令用法 yum repolist ...

  10. How to recover if NMC cound not connect

    Some times we suddently find that the NMC can not login,. You would see the sybase database error if ...