JavaSE——线程调度
线程调度:
按照特定机制为线程分配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——线程调度的更多相关文章
- Android(java)学习笔记215:多线程断点下载的原理(JavaSE实现)
1. 为什么需要多线程下载? 服务器的资源有限,同时的平均地分配给每个客户端.开启的线程越多抢占的服务的资源就越多,下载的速度就越块. 2. 下载速度的限制条件? (1)你的电脑手机宽带的带宽 ...
- JavaSE 面试题总结
一. JavaSE 4 1. 面向对象的特征有哪些方面 4 2. String是最基本的数据类型吗? 4 3. super()与this()的区别? 4 4. JAVA的事件委托机制和垃圾回收机制 4 ...
- Android(java)学习笔记158:多线程断点下载的原理(JavaSE实现)
1. 为什么需要多线程下载? 服务器的资源有限,同时的平均地分配给每个客户端.开启的线程越多抢占的服务的资源就越多,下载的速度就越块. 2. 下载速度的限制条件? (1)你的电脑手机宽带的带宽 ...
- JavaSE学习笔记(12)---线程
JavaSE学习笔记(12)---线程 多线程 并发与并行 并发:指两个或多个事件在同一个时间段内发生. 并行:指两个或多个事件在同一时刻发生(同时发生). 在操作系统中,安装了多个程序,并发指的是在 ...
- 【012】JavaSE面试题(十二):多线程(2)
第一期:Java面试 - 100题,梳理各大网站优秀面试题.大家可以跟着我一起来刷刷Java理论知识 [012] - JavaSE面试题(十二):多线程(2) 第1问:多线程的创建方式? 方式一:继承 ...
- 用大白话聊聊JavaSE -- 如何理解Java Bean(一)
首先,在开始本章之前,先说一个总的概念:所谓的Java Bean,就是一个java类,编译后成为了一个后缀名是 .class的文件.这就是Java Bean,很多初学者,包括当年的我自己,总是被这些专 ...
- javaSE基础07
javaSE基础07 一.static静态修饰符 用了static修饰的变量就会变成共享的属性,只会初始化一次,在内存中只存在一个,并且每个对象都可以访问,存放在方法区(数据共享区) 1.1 stat ...
- javaSE基础06
javaSE基础06 一.匿名对象 没有名字的对象,叫做匿名对象. 1.2匿名对象的使用注意点: 1.我们一般不会用匿名对象给属性赋值的,无法获取属性值(现阶段只能设置和拿到一个属性值.只能调用一次方 ...
- javaSE基础05
javaSE基础05:面向对象 一.数组 数组的内存管理 : 一块连续的空间来存储元素. Int [ ] arr = new int[ ]; 创建一个int类型的数组,arr只是一个变量,只是数组的一 ...
随机推荐
- js DOM 案例
模态框 <html> <head> <meta charset="UTF-8"> <title>模态框</title> ...
- 从C#到TypeScript - 类型
总目录 从C#到TypeScript - 类型 从C#到TypeScript - 高级类型 从C#到TypeScript - 变量 从C#到TypeScript - 接口 从C#到TypeScript ...
- Java实现二分法排序
二分法:(二分法不是只能做数组,这里的数组只是为了举例) 在给出的有序排列的数组中,把目标值和数组中间值进行比较,如果相等,则返回中间值下标,如果目标值小于中间值,就从数组的前半段再次执行二分法查找, ...
- (转)explain、db2exfmt 命令的使用:文本输出执行计划
原文:http://blog.51cto.com/freebile/1068610 db2有图形执行计划显示工具,如果没有图形环境,如unix主机,可以生成文本的文件来显示执行计划1.如果第一次执行, ...
- mybatis 关联映射
一对一 创建数据表 CREATE TABLE `tb_card` ( `id` int NOT NULL AUTO_INCREMENT , `code` varchar() NULL , PRIMAR ...
- 公共技术点( View 绘制流程)
转载地址:http://p.codekk.com/blogs/detail/54cfab086c4761e5001b253f 本文为 Android 开源项目源码解析 公共技术点中的 View 绘制流 ...
- Python爬取简书主页信息
主要学习如何通过抓包工具分析简书的Ajax加载,有时间再写一个Multithread proxy spider提升效率. 1. 关键点: 使用单线程爬取,未登录,爬取简书主页Ajax加载的内容.主要有 ...
- linux less命令详情
less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大.less 的用法比起 more .tail更加的有弹性.在 more 的时候,我们并没有办 ...
- WPF中Grid的行的Height和列的Width根据内容自适应
Grid中RowDefinition的Height和ColumnDefinition的设置都有三种: 1. 具体数值,固定不变: 2. * 星号,如: 2*,5*,8*: 分母为(2+5+8=15), ...
- 「每日一码」(精品代码,质量保证)empty和undefined
将每天看到的优秀的代码或者特别的实现,记录下来 2019-2-26 empty和undefined 数组的filter,以下输出结果是什么 var arr = [1,2,3]; arr[10] = 9 ...