线程调度:

按照特定机制为线程分配cpu的使用权。

线程调度模型:

分时调度

所有线程轮流获得cpu的使用权,平均分配每个线程占用的cpu的时间片。

抢占时调度(java虚拟机)

  可运行池中优先级高的线程有更大机会获得cpu使用权,如果可运行池中线程的优先级相同,则随机选择一个线程来使用cpu。

线程的优先级:

java中,优先级用整数 1-10 表示,Thread类有三个静态常量,

    MAX_PRIORITY: 10 表示最高优先级

  NORM_PRIORITY:5 表示默认优先级

  MIN_PRIORITY:1 表示最低优先级

可以在编程过程中自己设定线程实例对象的优先级

一个线程的优先级设置原则:

  线程创建时,子类继承父类的优先级。

  线程创建后,可通过调用setPriority()方法改变优先级。但是 ot.setpriority(Thread.MIN_PRIORITY) 要在start()之前

  线程的优先级是1-10之间的正整数,默认值是5。

  但优先级高的线程只是有更大可能获得cpu占用权但并不一定优先执行。

后台线程:

  前台线程创建的线程实例对象为前台线程,如main线程;

  后台线程即为其他线程服务的线程,也称为守护线程,如JVM中的垃圾回收线程,负责回收其他线程不再使用的内存空间。

  设置线程为后台线程:

  mt.setDaemon(true)设置 mt 为后台线程。

  要在start()之前调用 setDaemon()否则会发生异常。

  若前台线程结束运行,则后台线程也结束。

线程让步:

yeild()方法

  当线程在运行过程中执行了Thread类的yeild()方法,此时如果有其他优先级等于或高于当前运行线程的线程处于就绪状态,则yeild()方法将把当前正在运行的线程放到可运行池中使其他线程运行,如果执行了yeild()方法,但没有符合条件的其他线程,则yeild()方法什么也不做。

  在java操作平台为抢占时调度模型,每一次循环相当于线程(此时运行池中所有线程)在一个时间片上运行,优先级均为默认值的两个线程随机占用cpu即运行先后顺序是随机的。此时,

yeile()执行当 i为2时A线程运行后暂时让出cpu让步B线程运行。

此时B线程的优先级低于A线程,虽然执行了yeild()方法,但yeild()方法不起任何作用。

等待其他线程结束:

join()方法

  当前运行的线程调用另一个线程的 join()方法,然后当前运行的线程转到堵塞状态,等到另一个线程运行结束(不管线程的优先级如何),它才会恢复到运行状态(转到就绪状态)。

package jiaru;

public class MyThread extends Thread {
public MyThread(String name){
super(name);
} public void run(){
for(int i = 0;i<10;i++){
System.out.println(Thread.currentThread().getName()+"----"+i);
try {
sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} } }
package jiaru;

public class Demo01 {

	public static void main(String[] args) {
// TODO Auto-generated method stub
MyThread mt = new MyThread("b");
mt.start();
for(int i =0;i<5;i++){
System.out.println(Thread.currentThread().getName()+"---"+i);
try {
Thread.sleep(500);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
if(i ==1){
try {
mt.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} } } }

运行结果:

在主函数中,实例了一个mt线程,运行了该线程的start()方法后,该线程处于可运行状态,然后主函数继续向下运行,i = 0时,开始打印主线程,然后主线程此时有0.5秒的休眠时间,在此期间,b线程开始打印,由于b线程的休眠时间为0.2秒,所以每打印完一个main线程后在0.5秒内可以打印两个或者三个b线程。   i =1时,mt线程的join()方法被主函数调用,此时,main线程将转为堵塞状态让处于就绪状态的b 线程先运行,b运行结束后,主线程继续运行。

如有不对之处还望指正,谢谢。

JavaSE——线程调度的更多相关文章

  1. Android(java)学习笔记215:多线程断点下载的原理(JavaSE实现)

    1. 为什么需要多线程下载?     服务器的资源有限,同时的平均地分配给每个客户端.开启的线程越多抢占的服务的资源就越多,下载的速度就越块. 2. 下载速度的限制条件? (1)你的电脑手机宽带的带宽 ...

  2. JavaSE 面试题总结

    一. JavaSE 4 1. 面向对象的特征有哪些方面 4 2. String是最基本的数据类型吗? 4 3. super()与this()的区别? 4 4. JAVA的事件委托机制和垃圾回收机制 4 ...

  3. Android(java)学习笔记158:多线程断点下载的原理(JavaSE实现)

    1. 为什么需要多线程下载?     服务器的资源有限,同时的平均地分配给每个客户端.开启的线程越多抢占的服务的资源就越多,下载的速度就越块. 2. 下载速度的限制条件? (1)你的电脑手机宽带的带宽 ...

  4. JavaSE学习笔记(12)---线程

    JavaSE学习笔记(12)---线程 多线程 并发与并行 并发:指两个或多个事件在同一个时间段内发生. 并行:指两个或多个事件在同一时刻发生(同时发生). 在操作系统中,安装了多个程序,并发指的是在 ...

  5. 【012】JavaSE面试题(十二):多线程(2)

    第一期:Java面试 - 100题,梳理各大网站优秀面试题.大家可以跟着我一起来刷刷Java理论知识 [012] - JavaSE面试题(十二):多线程(2) 第1问:多线程的创建方式? 方式一:继承 ...

  6. 用大白话聊聊JavaSE -- 如何理解Java Bean(一)

    首先,在开始本章之前,先说一个总的概念:所谓的Java Bean,就是一个java类,编译后成为了一个后缀名是 .class的文件.这就是Java Bean,很多初学者,包括当年的我自己,总是被这些专 ...

  7. javaSE基础07

    javaSE基础07 一.static静态修饰符 用了static修饰的变量就会变成共享的属性,只会初始化一次,在内存中只存在一个,并且每个对象都可以访问,存放在方法区(数据共享区) 1.1 stat ...

  8. javaSE基础06

    javaSE基础06 一.匿名对象 没有名字的对象,叫做匿名对象. 1.2匿名对象的使用注意点: 1.我们一般不会用匿名对象给属性赋值的,无法获取属性值(现阶段只能设置和拿到一个属性值.只能调用一次方 ...

  9. javaSE基础05

    javaSE基础05:面向对象 一.数组 数组的内存管理 : 一块连续的空间来存储元素. Int [ ] arr = new int[ ]; 创建一个int类型的数组,arr只是一个变量,只是数组的一 ...

随机推荐

  1. 深入理解java虚拟机读书笔记--java内存区域和管理

    第二章:Java内存区域和内存溢出异常 2.2运行时数据区域 运行时数据区分为方法区,堆,虚拟机栈,本地方法栈,程序计数器 方法区和堆是线程共享的区域 虚拟机栈,本地方法栈,程序计数器是数据隔离的数据 ...

  2. Docker端口映射(六)

    一.容器端口映射 1.1. 外部访问容器 在启动容器时候,如果不指定参数,在容器外部是无法通过网络来访问容器内的服务的 当容器运行一些网络服务的时候,我们可以通过指定-p或者-P参数来实现能够让外部访 ...

  3. POJ 2876

    #include<iostream> #include<string> using namespace std; ]; int main() { //freopen(" ...

  4. 业余实现一个统计A股数据工具

    自己瞎捣鼓了几天 python,数据来源新浪财经,每天收盘启动爬虫抓取一遍,web 端呈现日线与周线数据:实时图表显示上证指数与个股指数等.技术点:scrapy apscheduler sqlalch ...

  5. Error:fatal: Not a git repository (or any of the parent directories): .git

    在项目目录下执行git init命令. 大功告成.

  6. [原] ubuntu 13.10 安装 winqq2013

    安装及下载地址:http://www.longene.org/forum/viewtopic.php?t=4700 ubuntu 13.10 64位系统安装后无法启动qq,因为缺少程序包.解决方案: ...

  7. springboot-32-使用mvc测试

    Spring Boot可以和大部分流行的测试框架协同工作:通过Spring JUnit创建单元测试:生成测试数据初始化数据库用于测试:Spring Boot可以跟BDD(Behavier Driven ...

  8. xshell 登陆堡垒机实现自动跳转

    1, 正常使用用户密码登录堡垒机并保存登陆配置 2, 配置登陆脚本 添加第一个: expect 为空send :ssh root@ip 添加第二个: expect root@ip's password ...

  9. Flutter踩坑日记:接入现有iOS项目

    之前搞的Flutter版工具链已经弄完了,感兴趣的朋友可以围观下,Android版本dio库(v2.0.14)发送网络请求老是报错,去官方提了issue还没回,于是今天搞一下把Flutter模块接入到 ...

  10. angular ng-repeat点击切换样式,浅谈track by $index

    前言 angular ng-repeat点击切换样式,ng-repeat点击切换class样式,巧用ng-repeat track by $index. 1.问题 一个ul包含多个li,li通过ng- ...