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

news2024/11/20 4:37:35

🌺个人主页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)时,线程的生命周期便会结束。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3.1 Linux 前置知识

1、硬件 我们知道&#xff0c;组成计算机的硬件主要有“主机”和“输入/输出设备”。 主机包括机箱、电源、主板、CPU&#xff08;Central Processing Unit&#xff0c;中央处理器&#xff09;、内存、显卡、声卡、网卡、 硬盘、光驱等。输入/输出设备包括显示器、键盘、鼠标…

王道数据结构课后代码题p40 6.有一个带头结点的单链表L,设计一个算法使其元素递增有序 (c语言代码实现)

这一题其实用到了直接插入排序的思想 视频讲解在这里哦&#xff1a;&#x1f447; p40 第6题 王道数据结构课后代码题 c语言代码实现_哔哩哔哩_bilibili 本题代码为 void paixu(linklist* L)//对单链表内的元素排序 {lnode* p (*L)->next;lnode* pre *L;lnode* r p-&…

「 电商API接口系列之淘宝API接口调用 」

API从技术角度来说就是应用程序编程接口。通过API我们可以直接获取一些我们需要的数据结果&#xff0c;而不需要自己编写相应的程序&#xff0c;有点类似模块化调用函数&#xff0c;大大加快了我们编程的速度。当然这个数据传输是需要网络的&#xff0c;所以一般API的形式看起来…

论文十问:ResNet(Deep Residual Learning for Image Recognition)

文章目录 1. 论文试图解决什么问题?2. 这是否是一个新的问题?3. 这篇文章要验证一个什么科学假设?4. 有哪些相关研究&#xff1f;如何归类&#xff1f;谁是这一课题在领域内值得关注的研究员&#xff1f;5. 论文中提到的解决方案之关键是什么?6. 论文中的实验是如何设计的?…

stable diffusion comfyui的api使用教程

一、为什么要使用comfyui的api?对比webui的api&#xff0c;它有什么好处&#xff1f; 1、自带队列 2、支持websocket 3、无需关心插件是否有开放api接口&#xff0c;只要插件在浏览器中可以正常使用&#xff0c;接口就一定可以使用 4、开发人员只需关心绘图流程的搭建 5、切换…

【LeetCode刷题笔记】二叉树(二)

257. 二叉树的所有路径 解题思路: 1. DFS 前序遍历 ,每次递归将 当前节点的拼接结果 传递到 下一层 中,如果当前节点是 叶子节点 ,就将 当前拼接结果 收集答案并返回。 注意:路径path结果可以使用 String 来拼接,这样可以避免回溯处理。

Git 本地库基本教程

目录 一. Git 概述 1.1 何为版本控制 1.2 为什么需要版本控制 1.3 版本控制工具 1.3.1 集中式版本控制工具 1.3.2 分布式版本控制系统 1.4 Git简介 1.5 Git工作机制 1.6 Git 和代码托管中心 1.6.1 局域网 1.6.2 互联网 二. Git 安装 三. Git…

SystemC 学习之与 System Verilog 的混合仿真(九)

1、下载 uvmc (uvm connect) https://download.csdn.net/download/yp18792574062/88529417?spm1001.2014.3001.5501 2、配置相关环境变量 export UVM_HOME${VCS_HOME}/etc/uvm export UVMC_HOME/home/yangpan/yangpan/uvmc/uvmc-2.3.1 然后执行 source ~/.zshrc 更新 3、…

让公有云服务“宁安如梦”的“定心丸”在哪里?

电视剧《宁安如梦》正在热播中&#xff0c;该剧讲述了主人公在经历人生的重大风险后&#xff0c;重获新生再活一遍&#xff0c;以确定性的方式抵御和化解原有的重大风险。然而&#xff0c;在现实的生活中&#xff0c;却没有这样的重来机会。 2023年11月13日&#xff0c;Gartne…

二、服务拆分及远程调用

目录 一、注意事项&#xff1a; 1.单一职责: 2.数据独立: 3.面向服务&#xff1a; 二、服务拆分例子&#xff1a; 三、远程调用例子&#xff1a; 微服务调用方式&#xff1a; 四、提供者与消费者 服务调用关系&#xff1a; 一、注意事项&#xff1a; 1.单一职责: 不同…

某建筑网页js逆向分析过程(有坑)

某建筑网页&#xff1a; 网站&#xff1a; import base64 # 解码 website base64.b64decode(aHR0cHM6Ly9qenNjLm1vaHVyZC5nb3YuY24vZGF0YS9jb21wYW55.encode(utf-8)) print(website)JSON.parse() ​ 当你有一个包含JSON字符串的变量时&#xff0c;你可以使用JSON.parse()将…

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

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

19 - 如何用协程来优化多线程业务?

近几年&#xff0c;国内很多互联网公司开始使用或转型 Go 语言&#xff0c;其中一个很重要的原因就是 Go 语言优越的性能表现&#xff0c;而这个优势与 Go 实现的轻量级线程 Goroutines&#xff08;协程 Coroutine&#xff09;不无关系。那么 Go 协程的实现与 Java 线程的实现有…

高效免费办公神器——ONLYOFFICE入手指南

前言&#xff1a; 作为开发者&#xff0c;有时候经常为寻找适合的开发工具而苦恼&#xff1b;或者因为高昂的费用而犹豫不决&#xff1b;亦或喜欢的办公产品只能在单一的平台上使用&#xff0c;与其把时间花在复杂的工具使用上&#xff0c;不如节省出时间投入思考和技术的提升。…

【洛谷算法题】P5711-闰年判断【入门2分支结构】

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5711-闰年判断【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格式&a…

js写轮播图,逐步完善

目录 1、自动轮播 2、点击更换 3、自动播放加左右箭头点击切换 4、完整版轮播图 1、自动轮播 用定时器setInterval()来写&#xff0c;可以实现自动播放 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><met…

一例plugx样本的分析(AcroRd32cWP)

这是一例plugx的样本&#xff0c;使用了一个合法签名的程序 &#xff0c;使用侧加载的方式加载一个恶意的dll&#xff0c;解密一个dat文件来&#xff0c;在内存中执行一个反射型dll来完成恶意功能。 这个病毒会使用摆渡的方式的来窃取内网的文档数据&#xff0c;具有严重的失泄…

Git新建分支

修改代码之Git策略思考&#xff1a; 有三种办法&#xff1a; 需要在主分支上新建一个分支&#xff0c;不合并新建版本。其实也是先新建一个分支&#xff0c;然后合并到主分支&#xff0c;再删除分支。直接新建远程仓库。 考虑&#xff0c;3&#xff09;最浪费&#xff0c;其…

QGIS之十七按范围选择要素

效果 步骤 1、准备数据 &#xff08;1&#xff09;、范围面 &#xff08;2&#xff09;、point 2、Qgis中裁剪 工具箱中搜索“裁剪” 注意编码问题 3、裁剪结果

Skybox天空盒子的更换教程_unity基础开发教程

Skybox天空盒子的更换 Skybox的下载与导入更换SkyboxSkybox属性自定义 Skybox的下载与导入 打开资源商店 搜索FREE Skybox 这里是我使用的是这一款资源&#xff0c;点击添加至我的资源 打开包管理器Package Manager Packages选择My Assets 搜索Sky 选择刚刚添加的天空盒子 点…