线程调度:

按照特定机制为线程分配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. JS常用工具函数(持续记录)

    1.设置获取cookie //方式1 //设置cookie function SetCookie(name, value)//两个参数,一个是cookie的名字,一个是值 { var Days = 3 ...

  2. oracle 闪回、归档的设置建议

    闪回与归档的相关测试 参考博客:http://www.cnblogs.com/hellojesson/p/7050097.html 数据库在归档模式下的管理 参考博客:http://www.cnblo ...

  3. C#:ListView控件如何实现点击列表头进行排序?

    using System; using System.Collections; using System.Windows.Forms; namespace Common { /// <summa ...

  4. Stack Overflow 2016 最新架构探秘

    原文:http://nickcraver.com/blog/2016/02/17/stack-overflow-the-architecture-2016-edition/ 转载:http://www ...

  5. elk-nginx输出json格式的日志

    把Nginx日志的格式输出成JSON格式展示在Kibana面板,生产环境中基本都是这么使用. 1, 配置nginx 主要修改nginx的访问日志格式,这里定义成json格式,以便后面logstash更 ...

  6. 【IT笔试面试题整理】反转链表

    [试题描述]定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点 [参考代码] 方法一: public static Link reverseLinkList(Link head) ...

  7. mac 上位Idea 配置Project SDK

    问题 刚开始没有Project SDK 方法 添加SDK: /Library/Java/JavaVirtualMachines/jdkXYZ_VERSION.jdk/Contents/Home/jre ...

  8. RSA实现前端数据加密

    一.前言 一般在登录注册的时候,不能以明文的方式传递数据到后台,如果是http下,很容易被劫持.所以对数据进行加密是常规做法. 二.RSA算法 ”RSA加密算法是一种非对称加密算法.对极大整数做因数分 ...

  9. python的Web框架:Django路由系统以及模板导入

    Django的路由系统 当一个请求来到时 当一个请求来到时 1.首先到项目目录下的urls.py(根URLconf模块)中,查找路由规则: 2.根URELcof模块,里面定义了 urlpatterns ...

  10. syslog - 日志文件详解

    日志文件,是linux最为重要的记录文件,记录着日常的操作. 我们在linux编程的时候,通常会使用日志文件记录操作和信息,日志系统提供了我们几个API接口供调用 1. API void openlo ...