线程调度:

按照特定机制为线程分配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. pip指定网址安装

    用pip安装库的有时候很慢都动不了 ,访问速度很慢,不稳定等缺陷 所以呢为了解决这个问题只能指定网址源下载的话速度就很快了 pip安装默认访问的是https://pypi.Python.org/sim ...

  2. 精通CSS 第1章

    一 标记简史 1 使用有意义的元素 2 ID和类名:ID是唯一的,而一个类名可以应用于多个元素.在写ID和类名时需要注意区分大小写,并使用统一的命名约定,比如完全小写+连字符分割,例andy-budd ...

  3. 剑指offer十四之链表中倒数第k个结点

    一.题目 输入一个链表,输出该链表中倒数第k个结点. 二.思路 两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指正走(k-1)步,到达第k个节点.然后两个指针同时往后移动,当第一个结 ...

  4. MapReduce中的partitioner

    1.日志源文件: 1363157985066 13726230503 00-FD-07-A4-72-B8:CMCC 120.196.100.82 i02.c.aliimg.com 24 27 2481 ...

  5. spring cloud(服务消费者(利用ribbon实现服务消费及负载均衡)——初学二)

    Ribbon是一个基于HTTP和TCP客户端的负载均衡器,利用ribbon实现服务消费,并实现客户端的负载均衡. 一.准备工作(利用上一节的内容) 启动服务注册中心 启动computer-servic ...

  6. Log4j最佳实践

    本文是结合项目中使用Log4j总结的最佳实践,非转载.网上可以找到的是这一篇<Log4j最佳实践>.本来Log4j使用是非常简单的,无需多介绍其用法,这只是在小型项目中:但在大型的项目中使 ...

  7. 杂谈:Windows操作系统的介绍与对Win8操作系统市场反响冷淡原因的分析

    Windows操作系统,毫无疑问是操作系统市场上的霸主,也正因为Windows操作系统的诞生让电脑的操作性能变得更加平民化,深的用户的喜爱.至今身边的人也是选择windows操作系统的居多,这篇文章也 ...

  8. PHP多进程系列笔记(一)

    本系列文章将向大家讲解pcntl_*系列函数,从而更深入的理解进程相关知识. PCNTL在PHP中进程控制支持默认是关闭的.您需要使用 --enable-pcntl 配置选项重新编译PHP的 CGI或 ...

  9. Yum安装Zabbix4.2.0

    目录 1. 下载所需的存储库 2. 安装zabbix 3. 安装mysql 4. 配置数据库 5. 基本配置 6. zabbix配置文件 7. 进入web安装zabbix 1. 下载所需的存储库 # ...

  10. Disruptor多个消费者不重复处理生产者发送过来的消息

    1.定义事件事件(Event)就是通过 Disruptor 进行交换的数据类型. package com.ljq.disruptor; import java.io.Serializable; /** ...