Day25-C:\Users\Lenovo\Desktop\note\code\JavaSE\Basic\src\com\Threadcase-多线程讲到等待唤醒机制的一半

news/2025/10/28 18:44:35/文章来源:https://www.cnblogs.com/David0919/p/19172484

多线程

进程

进程是程序的基本执行实体

线程

线程是操作系统能够进行运算调度的最小单位,它被包含在进程中,是进程中实际运行的基本单位

应用软件中相互独立,可以独立运行的功能

多线程就是同时运行多个子程序,提高效率

并发

在同一时刻,有多个指令在单个CPU上交替运行

并行

在同一时刻,有多个指令在多个CPU上同时运行

image-20251028130038443

image-20251028131448799

package Basic.src.com.Threadcase.Threadcase1;public class MyThread extends Thread{public void run(){for (int i = 0; i < 100; i++) {System.out.println(getName()+"Hello,World");}}
}
package Basic.src.com.Threadcase.Threadcase1;public class ThreadDemo {/** 多线程的第一种启动方式:* 1.定义一个类其继承thread类* 2.重写里面的run方法* 3.创建子类的对象,并启动线程** */public static void main(String[] args) {MyThread t1 = new MyThread();MyThread t2 = new MyThread();//start()才表示开启线程t1.setName("t1");t2.setName("t2");t1.start();t2.start();}
}
package Basic.src.com.Threadcase.Threadcase2;public class MyRun implements Runnable{private String name;@Overridepublic void run() {//书写线程需要的代码for (int i = 0; i <100; i++) {Thread t = Thread.currentThread();//getName方法得在Thread类里面找System.out.println(t.getName()+"Hello World");System.out.println(Thread.currentThread().getName()+"Hello World!");}}
}
package Basic.src.com.Threadcase.Threadcase2;public class ThreadDemo {/** 多线程的第二种启动方式:* 1.自己定义一个类实现Runnable接口* 2.重写里面的run方法* 3.创建自己的类的对象* 4.创建一个Thread类对象并开启线程*** */public static void main(String[] args) {//创建MyRun对象//表示多线程要执行的任务MyRun mr = new MyRun();//创建线程对象Thread t1 = new Thread(mr);Thread t2 = new Thread(mr);//线程设置名字t1.setName("Thread1");t2.setName("Thread2");//开启线程t1.start();t2.start();}
}
package Basic.src.com.Threadcase.Threadcase3;import java.util.concurrent.Callable;public class MyCallable implements Callable<Integer> {//Integer是返回的结构的类型@Overridepublic Integer call() throws Exception {//求1~100之间的和int sum = 0;for (int i = 0; i <= 100; i++) {sum += i;}return sum;}
}
package Basic.src.com.Threadcase.Threadcase3;import Basic.src.com.Threadcase.Threadcase1.MyThread;import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;public class ThreadDemo {/** 多线程的第三种启动方式:* 特点:可以获取到多线程运行的结构* 1.自己定义一个MyCallable类实现Callable接口* 2.重写里面的call方法,有返回值* 3.创建自己的MyCallable类的对象* 4.创建一个FutureTask类对象作用管理多线程运行的结果*5.创建Thread类的对象,并启动(表示线程)** */public static void main(String[] args) throws ExecutionException, InterruptedException {//3.创建自己的MyCallable类的对象,表示多线程要执行的任务MyCallable mc = new MyCallable();//4.创建一个FutureTask类对象作用管理多线程运行的结果FutureTask<Integer> ft = new FutureTask<>(mc);//5.创建Thread类的对象,并启动(表示线程)Thread t1 = new Thread(ft);//public Thread(Runnable target)//启动线程t1.start();//获取多线程Integer res = ft.get();System.out.println(res);}
}

抢占式调度(与非抢占式调度区别)

抢占式调度:随机

具有优先级

package Basic.src.com.Threadcase.ThreadPriority;public class MyRunnable implements Runnable {@Overridepublic void run() {for (int i = 0; i <= 100; i++) {Thread t = Thread.currentThread();System.out.println(t.getName()+"---------"+i);}}
}
package Basic.src.com.Threadcase.ThreadPriority;public class ThreadDemo {public static void main(String[] args) {//创建线程所要执行的参数对象MyRunnable mr = new MyRunnable();//创建线程对象Thread t1 = new Thread(mr,"飞机");Thread t2 = new Thread(mr,"坦克");System.out.println(t1.getPriority());//默认优先级是5System.out.println(t2.getPriority());System.out.println(Thread.currentThread().getPriority());//5//优先级越高抢到cpu的概率就越高t1.setPriority(Thread.MIN_PRIORITY);t2.setPriority(Thread.MAX_PRIORITY);t1.start();t2.start();}
}

守护线程

package Basic.src.com.Threadcase.DaemonThread;public class MyThread1 extends Thread {@Overridepublic void run() {for (int i = 0; i <= 10; i++) {System.out.println(getName()+"@"+i);}}
}
package Basic.src.com.Threadcase.DaemonThread;public class MyThread2 extends Thread {public void run() {for (int i = 0; i <= 100; i++) {System.out.println(getName()+"@"+i);}}
}
package Basic.src.com.Threadcase.DaemonThread;import Basic.src.com.Threadcase.Threadcase1.MyThread;public class ThreadDemo {public static void main(String[] args) {/** 当其他非守护线程执行结束后,守护线程也会陆续结束* 当女神线程结束了,备胎也没有存在的必要* */MyThread1 t1 = new MyThread1();MyThread2 t2 = new MyThread2();t1.setName("女神");t2.setName("备胎");//把第二个线程设置为守护线程(备胎线程)t2.setDaemon(true);t1.start();t2.start();}
}

出让线程

package Basic.src.com.Threadcase.Threadyield;public class MyThread extends Thread{@Overridepublic void run() {for (int i = 0; i < 100; i++) {System.out.println(getName()+"@"+i);//表示出让当前CPU的执行权Thread.yield();//提高均匀度(一定程度上)}}
}
package Basic.src.com.Threadcase.Threadyield;public class ThreadDemo {public static void main(String[] args) {MyThread t1 = new MyThread();MyThread t2 = new MyThread();t1.setName("飞机");t2.setName("坦克");t1.start();t2.start();}
}

插入线程

package Basic.src.com.Threadcase.ThreadJoin;public class MyThread extends Thread{@Overridepublic void run() {for (int i = 0; i < 100; i++) {System.out.println(getName()+"@"+i);}}}
package Basic.src.com.Threadcase.ThreadJoin;public class ThreadDemo {public static void main(String[] args) throws InterruptedException {/*** */MyThread t = new MyThread();t.setName("土豆");t.start();//把t线程插入到当前线程之前:当前main线程t.join();//执行在main线程中for (int i = 0; i <= 10; i++) {System.out.println("main"+i);}}
}

代码的生命周期

image-20251028162130440

线程安全

同步代码块

package Basic.src.com.Threadcase.ThreadTicket;public class MyThread extends Thread{static int ticket = 0;//static表示这个类所有的对象共享ticket,不加会卖票300张@Overridepublic void run() {while (true) {//同步代码块synchronized (MyThread.class) {//锁对象一定要是唯一的if (ticket < 100) {try {Thread.sleep(100);//睡眠时没有CPU执行权,会被其他线程抢走} catch (InterruptedException e) {throw new RuntimeException(e);}ticket++;System.out.println(getName()+"正在卖票第"+ ticket+"张票!!");}else{break;}}}}
}
package Basic.src.com.Threadcase.ThreadTicket;public class ThreadDemo {public static void main(String[] args) {/** 需求:某电影院正在上映国产大片,一共有100张票,而他有三个窗口卖,请设计一个程序模拟电影院卖票* *///创建线程对象MyThread t1 = new MyThread();MyThread t2 = new MyThread();MyThread t3 = new MyThread();//起名字t1.setName("窗口1");t2.setName("窗口2");t3.setName("窗口3");//开启线程t1.start();t2.start();t3.start();}}

同步方法

image-20251028170054687

package Basic.src.com.Threadcase.ThreadSafe.ThreadTicket1;public class MyRunnable implements Runnable {int ticket = 0;@Overridepublic void run() {//1.循环//2.同步代码块(同步方法)//3.判断共享数据是否到了末尾,如果到了末尾//4.判断共享数据是否到了末尾,如果没有到末尾while (true) {if (method()) break;}}//ctrl+alt+M//this默认(非静态),此时是唯一的,因为MyRunnable只实现了一次private synchronized boolean method() {//达到末尾if (ticket == 100) {return true;}//没有达到末尾else  {try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}ticket++;System.out.println(Thread.currentThread().getName()+"在卖第"+ticket+"张票");}return false;}
}
package Basic.src.com.Threadcase.ThreadSafe.ThreadTicket1;public class ThreadDemo {/** 需求:某电影院正在上映国产大片,一共有100张票,而他有三个窗口卖,请设计一个程序模拟电影院卖票* 利用同步方法完成* 技巧:同步代码块* */public static void main(String[] args) {MyRunnable mr = new MyRunnable();Thread t1 = new Thread(mr);Thread t2 = new Thread(mr);Thread t3 = new Thread(mr);t1.setName("窗口1");t2.setName("窗口2");t3.setName("窗口3");t1.start();t2.start();t3.start();}
}

StringBuilder和StringBuffer

StringBuilder非线程安全

StringBuffer线程安全

Lock锁

是接口不能直接实例化,可以采用它的实现类ReentrantLock来实例化

package Basic.src.com.Threadcase.ThreadSafe.Lock;import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class MyThread extends Thread {static int ticket = 0;static Lock lock = new ReentrantLock();//Lock是接口不能直接实例化//必须加上static关键字在lock前面,否则就是三个对象三把锁//如果锁对象不声明为 static,则它是实例成员变量—— 每个类的实例会拥有独立的锁对象。// 此时,不同实例的线程会持有不同的锁,无法实现跨实例的同步,导致同步失效。@Overridepublic void run() {while (true) {//同步代码块,不能写在循环外面,否则会一直是一个窗口抢票//synchronized (Basic.src.com.Threadcase.ThreadSafe.Lock.MyThread.class) {//锁对象一定要是唯一的。MyThread.class表示当前类的字节码文件对象lock.lock();//上锁与synchronized重复try {if (ticket == 100) {break;//break会跳过unlock,}//没有达到末尾else  {Thread.sleep(100);ticket++;System.out.println(Thread.currentThread().getName()+"在卖第"+ticket+"张票");}} catch (InterruptedException e) {throw new RuntimeException(e);} finally {//finally里面保证了锁一定被释放lock.unlock();//开锁}//}}}
}
package Basic.src.com.Threadcase.ThreadSafe.Lock;import Basic.src.com.Threadcase.ThreadSafe.ThreadTicket1.MyRunnable;public class ThreadDemo {public static void main(String[] args) {MyThread t1 = new MyThread();MyThread t2 = new MyThread();MyThread t3 = new MyThread();t1.setName("窗口1");t2.setName("窗口2");t3.setName("窗口3");t1.start();t2.start();t3.start();}
}

死锁

是一个错误

指的是锁的嵌套

package Basic.src.com.Threadcase.ThreadSafe.DeadLock;public class MyThread extends Thread{static Object objA = new Object();static Object objB = new Object();@Overridepublic void run() {while(true){if("线程A".equals(Thread.currentThread().getName())){synchronized (objA){System.out.println("线程A拿到了A锁,准备拿B锁");synchronized (objB){System.out.println("线程A拿到了B锁,顺利执行完一轮");}}} else if ("线程B".equals(Thread.currentThread().getName())) {synchronized (objB){System.out.println("线程B拿到了B锁,准备拿A锁");synchronized (objA){System.out.println("线程B拿到了A锁,顺利执行完一轮");}}}}}
}
package Basic.src.com.Threadcase.ThreadSafe.DeadLock;public class ThreadDemo {public static void main(String[] args) {MyThread t1 = new MyThread();MyThread t2 = new MyThread();t1.setName("线程A");t2.setName("线程B");t1.start();t2.start();}
}

等待唤醒机制

生产者和消费者

image-20251028182301622

image-20251028182448488

未讲完

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

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

相关文章

C++primer 类的静态成员

什么是静态存储方式 静态存储方式是程序编译时分配固定内存空间的机制,其存储位置及大小在程序运行前确定并保持不变,直至程序终止。和动态存储的区别:动态存储根据需求动态分配内存(如函数参数),而静态存储在编…

CSP-S NOIP 2025 备考

长 \(n\) 序列 \(a\),\(a_i\) 可以把自己的值往左右的 \(a\) 转移。最少多少次转移使得所有数相同。\((x,y,k)\) 代表 \(a_x\) 给出 \(d\) 的值给 \(a_y\)。保证有解,并且要求构造字典序最小的一组解。\(n\le3e5\)。…

netcore vue socket.io

netcore vue socket.io 一、后端创建项目 # 添加解决方案 > dotnet new sln -n Apricot.Socket.IO# 添加 asp net core 项目 > dotnet new web -n Apricot.Socket.IO# 将 web 项目添加至解决方案 > dotnet sl…

Docker安装DPanel(docker容器管理工具)

标准版docker run -d --name dpanel --restart=always \-p 80:80 -p 443:443 -p 8807:8080 -e APP_NAME=dpanel \-v /var/run/docker.sock:/var/run/docker.sock -v dpanel:/dpanel \dpanel/dpanel:latest 精简版lite…

2025 年最佳AI智能企业知识管理工具推荐

导语 随着大语言模型的迅猛发展,知识管理领域正在经历一场深刻的变革。AI驱动的智能知识库已不再仅仅是信息的存储库,而是逐渐演变为企业数字化转型的核心引擎。根据Gartner发布的《2025年企业AI应用趋势报告》,超过…

制造业设备管理的三个坑,90% 的工厂都踩过

我常年跑工厂,接触过不少制造企业,和老板、车间主任聊下来,发现一个普遍的现象:大家都很重视设备,但真正能把设备管理做好的企业并不多。 大部分工厂都踩过坑,而且踩来踩去,往往就是那几个坑。 今天我就结合我这…

【硬件测试】基于FPGA的8PSK+帧同步系统开发与硬件片内测试,包含高斯信道,误码统计,可设置SNR

1.算法硬件测试效果 硬件ila测试结果如下:(完整代码运行后无水印): vio设置SNR=30dbvio设置SNR=15db硬件测试操作步骤可参考程序配套的操作视频。 2.算法涉及理论知识概要 随着通信技术的不断发展,相位调制技术因…

移动端性能监控探索:可观测 Android 采集探针架构与实现

Android 应用上线后像黑盒?阿里云 RUM SDK 来破局!无侵入采集崩溃、卡顿、ANR、网络、页面等全维度数据,支持用户会话回溯,让问题一目了然,快速提升稳定性与用户体验!作者:路锦(小蘭) 背景介绍 Android 生态背景…

2025年建站AI工具TOP10盘点:从ChatGPT到Lynx的智能革命

​ 随着AI技术的突破性发展,2025年建站工具已从“代码生成”迈向“智能生态协同”。本文精选十大AI建站工具,聚焦其核心功能与行业适配性,助力企业实现从“建站”到“增长”的数字化跃迁。 1.Lynx AI(云集AI) 核心…

KPI绩效考核系统软件:让绩效管理由“难”变“易”的核心密钥

KPI绩效考核系统软件:让绩效管理由“难”变“易”的核心密钥一、KPI 绩效考核系统软件是什么 在现代企业管理中,绩效考核是衡量员工工作表现和推动组织目标实现的重要手段。而 KPI,即关键绩效指标(Key Performance…

CompleteMaintenance点检提交反复超时,日志显示执行中断

建模问题: Camstar技术文档后续不再支持对外开发查看,谢谢!熟人可以微信上可以找我要密码!(●◡●)😘宝子:除非不再醒来,除非太阳不再升起,不然都请你好好生活,挣扎着前进,开心的笑。(●◡●)

ICPC Nanjing Regional (部分题题解)

to be done contest link 难度标识 EZ-一眼丁真 HD-需要思考 IN-需要提示 AT-完全不是自己做出 E difficulty: EZ 模式串只有 \(7\) 个字符,最多左移 \(7\) 次就好了。 https://qoj.ac/submission/1586800 J difficul…

为何AI反诈骗防护比以往任何时候都更重要

随着数据泄露激增186%,网络诈骗已进入AI时代。文章深入解析AI如何被用于生成高度定制化钓鱼攻击,以及Avast推出的免费AI反诈骗工具Scam Guardian如何通过实时分析模式和语言来保护用户安全。在线诈骗正变得越来越智能…

2025 年最受欢迎的 50 款免费 AI 工具,无免费增值、无付费计划或无每日信用额度限制

Content Creation & Writing 内容创作与写作 ChatGPT Free (OpenAI) ChatGPT 免费版(OpenAI) Functionality: A conversational AI for writing, brainstorming, research, and coding assistance. Uses GPT-5 …

prometheus监控体系搭建

Prometheus监控体系搭建步骤(Ubuntu) 一、InfluxDB 1.8.0 安装 1、下载1.8.0版本deb包 wget https://dl.influxdata.com/influxdb/releases/influxdb_1.8.0_amd64.deb2、安装deb包 sudo dpkg -i influxdb_1.8.0_amd6…

分布式锁巅峰对决:Redis RedLock vs ZooKeeper临时节点——Redission看门狗如何破解续期困局 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Elasticsearch Hot Threads

1. Hot Threads 是什么? 简单来说:hot_threads 是 OpenSearch/Elasticsearch 提供的一个强大的诊断工具,用于分析当前集群中哪些“线程”正在“热火朝天”地工作,即消耗了最多的CPU资源。 详细解释:线程:OpenSea…

习题-良序集

习题1. 证明:每一个良序集都有上确界性质。2. (a) 证明:在良序集中,每一个不是最大元(如果存在的话)的元素有一个紧接后元。(b) 作出一个集合,它的每一个元素有一个紧接后元,但这个集合不是良序集。3. 集合\(\{…

2025年北京无人机执照培训机构推荐榜,caac无人机执照培训机构/caac无人机执照培训基地/聚焦企业服务品质与专业培训能力深度剖析

随着无人机技术在航拍、安防、应急救援等领域的应用日益广泛,CAAC 无人机执照作为合法飞行的核心凭证,其培训需求持续攀升。游客在选择培训机构时面临诸多困惑 —— 如何辨别机构合规性、如何匹配自身职业需求的培训…

MySQL 数据加密整改文档(TDE + 字段加密 + 密码哈希)

MySQL 数据加密整改文档(TDE + 字段加密 + 密码哈希) 适用环境:MySQL 版本:8.0.26 数据库:hnp 关键表:sys_user 存储路径示例:/mnt/sdc/mysql1. 背景与问题 等保测评要求:安全控制点:数据保密性 控制项:应采…