【Java】线程的调度、生命周期及状态转换

🌺个人主页Dawn黎明开始

🎀系列专栏:Java
每日一句:夜色难免黑凉,前行必有曙光

📢欢迎大家:关注🔍+点赞👍+评论📝+收藏⭐️



文章目录

一.🔐线程的调度

1.1🔓定义

1.2🔓线程的优先级

1.1.1🔑说明

1.1.2🔑实例练习

1.3🔓线程的调度

1.3.1🔑线程休眠

1.3.2🔑线程插队

1.3.3🔑线程让步

1.3.4🔑中断线程 

二.🔐线程的生命周期和状态转换


一.🔐线程的调度

1.1🔓定义

         程序中的多个线程是并发执行的,但并不是同一时刻执行,某个线程若想被执行必须要得到CPU的使用权。Java虚拟机会按照特定的机制为程序中的每个线程分配CPU的使用权,这种机制被称作线程的调度

1.2🔓线程的优先级

1.1.1🔑说明

          在应用程序中,要对线程进行调度,最直接的方式就是设置线程的优先级优先级越高的线程获得CPU执行的机会越大,而优先级越低的线程获得CPU执行的机会越小。

注意

       (1). 线程默认优先级是5。

       (2).线程优先级的范围是:1-10。

       (3).线程优先级高仅仅表示线程获取的 CPU时间片的几率高,但是要在次数比较多,或者多次运行的时候才能看到比较好的效果。

如何获取线程对象的优先级?

 * public final int getPriority():返回线程对象的优先级

 * 如何设置线程对象的优先级呢?

 * public final void setPriority(int newPriority):更改线程的优先级。

除了可以直接使用数字表示线程的优先级,还可以使用Thread类中提供的三个静态常量表示线程的优先级。 

说明:程序在运行期间,处于就绪状态的每个线程都有自己的优先级,例如main线程具有普通优先级。

使用:可以通过Thread类的setPriority(int newPriority)方法对其进行设置,该方法中的参数newPriority接收的是1~10之间的整数或者Thread类的三个静态常量。

1.1.2🔑实例练习

代码如下👇🏻 

package Process2;

public class ThreadPriority implements Runnable {

	@Override
	public void run() {
		for(int i=0;i<200;i++) {
			System.out.println(Thread.currentThread().getName()+":"+i);
		}

	}

}
package Process2;

public class ThreadPriorityDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ThreadPriority tp = new ThreadPriority();

		Thread tp1 = new Thread(tp, "aaa");
		Thread tp2 = new Thread(tp, "bbb");
		Thread tp3 = new Thread(tp, "ccc");
		// 获取默认优先级
		 System.out.println(tp1.getPriority());
		 System.out.println(tp2.getPriority());
		 System.out.println(tp3.getPriority());


		// 设置线程的优先级
		tp1.setPriority(Thread.MAX_PRIORITY);
		tp2.setPriority(Thread.MIN_PRIORITY);

		tp1.start();
		tp2.start();
		tp3.start();

	}

}

 运行结果👇🏻

1.3🔓线程的调度

1.3.1🔑线程休眠

说明

       (1).如果想要人为地控制线程执行顺序,使正在执行的线程暂停,将CPU使用权让给其他线程,这时可以使用静态方法sleep(long millis)

       (2).该方法可以让当前正在执行的线程暂停一段时间,进入休眠等待状态,这样其他的线程就可以得到执行的机会。

       (3).sleep(long millis)方法会声明抛出InterruptedException异常,因此在调用该方法时应该捕获异常,或者声明抛出该异常。

 * public static void sleep(long millis)

代码如下👇🏻

package Process2;

import java.util.Date;

public class ThreadSleep extends Thread {
	@Override
	public void run() {
		for (int i = 0; i < 10; i++) {
			System.out.println(getName() + ":" + i + "" + new Date());
			// 休眠
			// 困了,我稍微休息1秒钟
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}
package Process2;

public class ThreadSleepDemo {
	public static void main(String[] args) {
		ThreadSleep ts1 = new ThreadSleep();
		ThreadSleep ts2 = new ThreadSleep();
		ThreadSleep ts3 = new ThreadSleep();

		ts1.setName("AAA");
		ts2.setName("BBB");
		ts3.setName("CCC");

		ts1.start();
		ts2.start();
		ts3.start();
	}
}

 运行结果👇🏻

1.3.2🔑线程插队

说明

       (1).在Thread类中也提供了一个join()方法来实现线程插队功能。

 * public final void join():线程插队,等待该线程终止后其它线程才能执行。

       (2).当在某个线程中调用其他线程的join()方法时,调用的线程将被阻塞,直到被join()方法加入的线程执行完成后它才会继续运行。

       (3).Thread类中还提供了带有时间参数的线程插队方法join(long millis)。当执行带有时间参数的join(long millis)进行线程插队时,必须等待插入的线程指定时间过后才会继续执行其他线程

代码如下👇🏻 

package Process2;

public class ThreadJoin implements Runnable {

	@Override
	public void run() {
		for(int i=0;i<5;i++) {
			System.out.println(Thread.currentThread().getName()+":"+i);
		}

	}

}
package Process2;

public class ThreadJoinDemo {
	public static void main(String[] args) throws InterruptedException {
		
		ThreadJoin th = new ThreadJoin();
		 
		Thread tj1 = new Thread(th,"AAA");
		Thread tj2 = new Thread(th,"BBB");
		Thread tj3 = new Thread(th,"CCC");

		tj3.start();
		tj3.join(); 
		
		tj1.start();
		tj2.start();
	}
}

运行结果👇🏻

1.3.3🔑线程让步

说明

        (1).线程让步可以通过yield()方法来实现,该方法和sleep(long millis)方法有点类似,都可以让当前正在运行的线程暂停,区别在于yield()方法不会阻塞该线程,它只是将线程转换成就绪状态,让系统的调度器重新调度一次。

       (2).当某个线程调用yield()方法之后,与当前线程优先级相同或者更高的线程可以获得执行的机会。

 * public static void yield():暂停当前正在执行的线程对象,并执行其他线程。

 * 让多个线程的执行更和谐,但是不能靠它保证一人一次。

代码如下👇🏻

package Process2;

public class ThreadYield implements Runnable {

	@Override
	public void run() {
		for (int i = 0; i <10; i++) {
			System.out.println(Thread.currentThread().getName() + ":" + i);
			Thread.yield();
		}

	}

} 
package Process2;

public class ThreadYieldDemo {
	public static void main(String[] args) {
		
		ThreadYield th = new ThreadYield();
		
		Thread ty1 = new Thread(th, "AAA");
		Thread ty2 = new Thread(th, "BBB");
		ty1.start();
		ty2.start();
	}
}

 运行结果👇🏻

1.3.4🔑中断线程 

* public void interrupt():中断线程。 把线程的状态终止,并抛出一个InterruptedException。

代码如下👇🏻

package Process2;

import java.util.Date;

public class ThreadInterrupt implements Runnable {
	@Override
	public void run() {
		System.out.println("线程开始执行:" + new Date());

		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			System.out.println("线程被终止了");
		}
		System.out.println("线程结束执行:" + new Date());
	}
}
package Process2;

public class ThreadInterruptDemo {
	public static void main(String[] args) throws InterruptedException {
		ThreadInterrupt ti = new ThreadInterrupt();

		Thread t = new Thread(ti, "线程终止!");
		
		t.start();
		
		Thread.sleep(3000);
		t.interrupt();
	}
}

 运行结果👇🏻

二.🔐线程的生命周期和状态转换

说明

          (1).在Java中,任何对象都有生命周期,线程也不例外,它也有自己的生命周期。

          (2).当Thread对象创建完成时,线程的生命周期便开始了。

          (3).当线程任务中代码正常执行完毕或者线程抛出一个未捕获的异常(Exception)或者错误(Error)时,线程的生命周期便会结束。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/146312.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

day08_子网划分与子网掩码

什么是子网划分? 1、概念&#xff1a;借主机位给网络位使用,以此来达到把一个大网段划分为n个儿子网段的目的&#xff0c;2. 为何要进行子网划分&#xff1f;3、子网掩码&#xff1a;就是对ip地址打记号4、 网络地址的计算机方式&#xff1a;ip地址与子网掩码都转换成二进制&a…

链表面试题

&#x1f493;作者简介&#x1f44f;&#xff1a;在校大二迷茫大学生 &#x1f496;个人主页&#x1f389;&#xff1a;小李很执着 &#x1f497;系列专栏&#xff1a;Leetcode经典题 每日分享&#xff1a;其实要过那条马路并不难&#xff0c;就看谁在对面等你❣️❣️❣️ 目录…

MySQL数据库约束

目录 数据库约束 1.NULL约束 2.UNIQUE&#xff1a;唯一约束 3.DEFAULT&#xff1a;默认值约束 4.PRIMARY KEY&#xff1a;主键约束 5.FOREIGN KEY&#xff1a;外键约束 数据库约束 以下为本篇文章会介绍的约束 (1)NOT NULL - 指示某列不能存储 NULL 值。 (2)UNIQUE - …

Spark SQL编程

1. Spark SQL概述 1.1 什么是Spark SQL Spark SQL是用于结构化数据处理的Spark模块。与基本的Spark RDD API不同&#xff0c;Spark SQL提供的接口为Spark提供了有关数据结构和正在执行的计算的更多信息。在内部&#xff0c;Spark SQL使用这些额外的信息来执行额外的优化。与Spa…

qt+opengl 着色器VAO、VBO、EBO(四)

文章目录 一、顶点着色器和片段着色器代码分析1. 着色器12. 顶点着色器2 二、使用步骤1. 使用着色器12. 使用着色器23. 在着色器2中使用EBO 三、完整代码 一、顶点着色器和片段着色器代码分析 1. 着色器1 用到的坐标矩阵, 四个四边形顶点坐标 float vertices_data[36] {// 所…

PlantUML基础使用教程

环境搭建 IDEA插件下载 打开IEDA系列IDE&#xff0c;从FIle–>Settings–>Plugins–>Marketplace 进入到插件下载界面&#xff0c;搜索PlantUML&#xff0c;安装PlantUML Integration和PlantUML Parser两个插件&#xff0c;并重启IDE 安装和配置Graphviz 进入官网…

C/C++轻量级并发TCP服务器框架Zinx-框架开发001: 读取标准输入,回显到标准输出

文章目录 完整代码实现参考-非项目使用项目使用的代码 - 乱-但是思路与上面的相同创建Kernel类添加删除修改epoll&#xff0c;才能写run方法创建stdin_Channel类在Kernel类中实现run方法 完整代码实现参考-非项目使用 #include <errno.h> #include <signal.h> #in…

蓝桥杯每日一题2023.11.14

题目描述 题目分析 此题目的最终目标是将字母都填上数使等式符合条件&#xff0c;实际我们发现可以使用搜索将所有符合条件的进行判断&#xff08;答案&#xff1a;29&#xff09; 由于小数可能会出现错误故我们将其进行简单变化进行搜索 #include<bits/stdc.h> using…

No207.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

Pytorch自动混合精度的计算:torch.cuda.amp.autocast

1 autocast介绍 1.1 什么是AMP? 默认情况下&#xff0c;大多数深度学习框架都采用32位浮点算法进行训练。2017年&#xff0c;NVIDIA研究了一种用于混合精度训练的方法&#xff0c;该方法在训练网络时将单精度&#xff08;FP32&#xff09;与半精度(FP16)结合在一起&#xff…

Dart利用私有构造函数_()创建单例模式

文章目录 类的构造函数_()函数dart中构造函数定义 类的构造函数 类的构造函数有两种&#xff1a; 1&#xff09;默认构造函数&#xff1a; 当实例化对象的时候&#xff0c;会自动调用的函数&#xff0c;构造函数的名称和类的名称相同&#xff0c;在一个类中默认构造函数只能由…

post 和get参数 请求

json参数 post请求格式 RestController public class HelloController { //json参数 post 请求RequestMapping("/jsonParam")public String jsonParam(RequestBody User user){System.out.println(user);return "OK";} } postman 接口测试工具…

spring cloud alibaba 简介

微服务搭建组件选型 1.服务注册中心 Nacos(spring-cloud-alibaba) 2.服务通信 OpenFeign(spring-cloud) 3.服务熔断、降级、限流 Sentinel(spring-cloud-alibaba) 4.网关 Gateway(spring-cloud) 5.服务配置中心 …

MySQL被攻击后创建数据库报错1044 - Access denied for user ‘root‘@‘%‘ to database ‘xxx‘

MySQL被攻击后创建数据库报错1044 - Access denied for user root% to database xxx 一、问题二、解决过程1、正常过程2、踩坑&#xff08;已经解决问题的可以不看&#xff09; 一、问题 最近数据库被攻击了&#xff0c;业务数据库都没了 还好也不是有重要数据&#xff0c;但再…

【HUST】网安纳米|2023年研究生纳米技术考试参考

目录 1 纳米材料是什么 2 纳米材料的结构特性 3 纳米结构的其他特性 4 纳米结构的检测技术 5 纳米材料的应用 打印建议&#xff1a;PPT彩印&#xff08;这样重点比较突出&#xff09;&#xff0c;每面12张PPT&#xff0c;简单做一下关键词目录&#xff0c;亲测可以看清。如…

Uniapp开发 购物商城源码 在线电商商城源码 适配移动终端项目及各小程序

lilishop电商商城系统 商城移动端&#xff0c;使用Uniapp开发&#xff0c;可编译为所有移动终端项目及各小程序 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88487579 源码下载2&#xff1a;关注我留言

02 # 类型基础:强类型与弱类型

宽泛的定义 在强类型语言中&#xff0c;当一个对象从调用函数传递到被调用函数时&#xff0c;其类型必须与被调用函数中声明的类型兼容 – Liskov, Zilles 1974 通俗定义 强类型语言不允许改变变量的数据类型&#xff0c;除非进行强制类型转换 比如下面 Java 里不能将布尔类…

最小二乘法及参数辨识

文章目录 一、最小二乘法1.1 定义1.2 SISO系统运用最小二乘估计进行辨识1.3 几何解释1.4 最小二乘法性质 二、加权最小二乘法三、递推最小二乘法四、增广最小二乘法 一、最小二乘法 1.1 定义 1974年高斯提出的最小二乘法的基本原理是未知量的最可能值是使各项实际观测值和计算…

〖大前端 - 基础入门三大核心之JS篇㉟〗- JavaScript 的DOM简介

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;不渴望力量的哈士奇(哈哥)&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xf…

基于Python实现汽车销售数据可视化【500010086】

导入模块 import numpy as np import pandas as pd import plotly.graph_objects as go import plotly.express as px获取数据 df1 pd.read_excel(r"./data/中国汽车总体销量.xlsx") print(df1.head(5))df1.info()df1[年份] df1[时间].dt.year df1[月份] df1[时…