当前位置: 首页 > news >正文

Java进程(基础)

基本概念

1、进程:程序的执行过程
2、线程:一个进程可以有单个线程也就是我们说的单线程,还可以有多个线程也就是我们说的多线程,

线程

1、当一个类继承了Thread类就可以当成一个线程用
2、我们会重写run方法写上我们自己的业务逻辑
3、run Thread类实现了RUnnable接口,静态代理模式

创建一个线程为什么是start不是直接调用run方法,如果直接调用run方法并没有创建一个线程,而是串行执行,start方法中的start0方法创建一个线程是由本地方法,是由JVM调用的

当一个类他已经继承了其他类,但是我们还想让其作为线程使用的话就可以让其实现Runable接口

package threaduse;public class Thread01 {public static void main(String[] args) {Cat cat = new Cat();//没有start方法//cat.start();Thread thread = new Thread(cat);thread.start();}
}
class Cat implements Runnable
{int cnt = 0;@Overridepublic void run() {while(true){System.out.println("小狗汪汪叫hi " + (++ cnt) + Thread.currentThread().getName());try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}if(cnt == 10)   break;}}
}

多个子线程案例

package threaduse;public class Thread03 {public static void main(String[] args) {T1 t1 = new T1();T2 t2 = new T2();Thread thread = new Thread(t1);Thread thread1 = new Thread(t2);thread1.start();thread.start();}}class T1 implements Runnable
{int cnt = 0;@Overridepublic void run() {while(true){System.out.println("hello world " + (++cnt));try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}if(cnt == 10)   break;}}
}
class T2 implements Runnable
{int cnt = 0;@Overridepublic void run() {while(true){System.out.println("hi " + (++cnt));try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}if(cnt == 10)   break;}}
}

模拟售票

package ticket;//使用多线程模拟三个窗口同时售票
public class SellTicket {public static void main(String[] args) {SellTicket01 sellTicket01 = new SellTicket01();SellTicket01 sellTicket011 = new SellTicket01();SellTicket01 sellTicket012 = new SellTicket01();sellTicket012.start();sellTicket011.start();sellTicket01.start();}
}//使用继承Thread
class SellTicket01 extends Thread
{private static int num = 100;@Overridepublic void run() {while(true){if(num <= 0){System.out.println("售票结束...");break;}//休眠50mstry {Thread.sleep(50);} catch (InterruptedException e) {}System.out.println("窗口 " + Thread.currentThread().getName() +"售出一张票" + "剩余票数 = " + (-- num));}}
}

出现问题

2.png
票重复卖
3.png

这里先提出问题后续会解决啦

通知线程退出

package exit_;public class Thread_Exit {public static void main(String[] args) throws InterruptedException {T t = new T();t.start();//如果我们希望main线程去控制t线程的终止,必须可以修改loop->通知方式//休眠10sThread.sleep(10 * 1000);t.setLoop(false);}
}class T extends Thread
{int cnt = 0;//设置一个变量private boolean loop = true;@Overridepublic void run() {while(loop){try {Thread.sleep(50);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("T还在运行" + (++ cnt));}}public void setLoop(boolean loop) {this.loop = loop;}
}

线程中断

线程的常用方法

1、start会调用run方法并且会创建一个新线程而单独调用run方法并不会创建新线程
2、interrupt,中断线程一般用于结束正在休眠的线程
3、sleep线程的休眠
3、现成的优先级
MAX、MIN、NORM

package Method;import sun.awt.windows.ThemeReader;public class ThreadMethod01 {public static void main(String[] args) throws InterruptedException {T t = new T();t.setName("阿杜");t.setPriority(Thread.MIN_PRIORITY);t.start();System.out.println(t.getName());//主线程打印5个hi,然后就中断子线程的休眠for(int i = 1; i <= 5; ++ i){Thread.sleep(1000);System.out.println("hi" + i);}t.interrupt();}
}//自定义的线程类
class T extends Thread
{@Overridepublic void run() {while(true){for(int i = 0; i < 100; ++ i){//Thread.currentThread().getName()获取当前线程的名称System.out.println(Thread.currentThread().getName() + "吃包子~~~~~" + i);}try {System.out.println(Thread.currentThread().getName() + "休眠中~~~~~");Thread.sleep(5000);} catch (InterruptedException e) {//InterruptedException捕获到一个中断异常System.out.println(Thread.currentThread().getName() + "被 interrupt了");}}}
}

线程插队

yield:线程的礼让,让出cpu让其他线程先执行,让出的时间不确定,所以也不一定能成功让出
join:线程的插队,插队一旦成功,就一定会先执行完插队的进程
join方法调用的是对方的,也就是你想让插队的那个线程的
例题
2.png

package Method;public class ThreadMethodExercise {public static void main(String[] args) throws InterruptedException {T3 t3 = new T3();Thread thread = new Thread(t3);for(int i = 1; i <= 10; ++ i){System.out.println("hi " + i);if(i == 5){thread.start();thread.join();}}}
}class T3 implements Runnable
{@Overridepublic void run() {for(int i = 1; i <= 10; ++ i){System.out.println("hello " + i);try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}

1.png

用户线程和守护线程

用户线程:也叫工作线程,当线程的任务执行完或以通知的形式结束
守护线程:一般是为用户线程工作的,当所有用户线程结束守护线程自动结束
常见的守护线程:垃圾回收机制
3.png

package Method;public class ThreadMethod03 {public static void main(String[] args) throws InterruptedException {MyDaemonThread myDaemonThread = new MyDaemonThread();//我们希望当主线程结束后子线程能自动结束,我们需要将子线程设置为守护线程myDaemonThread.setDaemon(true);myDaemonThread.start();for (int i = 1; i <= 10; ++i){System.out.println("阿杜在辛苦的工作");Thread.sleep(1000);}}
}class MyDaemonThread extends Thread
{@Overridepublic void run() {for(;;){try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("阿杜和阿范一直在聊天~~~~~");}}
}

4.png

线程的七大状态

6.png
5.png

线程同步

在多线程中,对一些敏感数据可能同一时刻只允许一个线程访问,为了保证数据的完整性,任何同一时刻我们都只让一个线程访问
synchronized

package syn;class SellTicket03 implements Runnable
{private static int num = 100;private boolean loop = true;public synchronized void sell(){if(num <= 0){System.out.println("售票结束。。。。");loop = false;return;}while(loop){if(num <= 0){System.out.println("售票结束...");break;}//休眠50mstry {Thread.sleep(50);} catch (InterruptedException e) {}System.out.println("窗口 " + Thread.currentThread().getName() +"售出一张票" + "剩余票数 = " + (-- num));}}@Overridepublic void run() {sell();}
}
//使用多线程模拟三个窗口同时售票
public class SellTicket {public static void main(String[] args) {SellTicket03 sellTicket03 = new SellTicket03();SellTicket03 sellTicket031 = new SellTicket03();Thread thread = new Thread(sellTicket03);Thread thread1 = new Thread(sellTicket031);thread.start();thread1.start();}
}

互斥锁

上面的同步机制就是利用了锁,当多个线程运行时,他们先争夺锁,只有获得锁的线程才能执行方法,上面的售卖票利用的就是互斥锁
1、java引入互斥锁的概念是为了保证共享数据的完整性
2、互斥锁,用关键字synchronized修饰时表明该对象在任何同一时刻只能有一个线程访问
3、同步之后因为同一时刻只有一个线程在执行,所以效率自然会降低
4、如果锁加在方法上,如果方法是静态的,锁加在类上,如果方法是非静态的,锁加在当前对象(this)上或则其他对象上(并不是很理解呜呜呜~~~~~)

互斥锁想要起作用,多个线程锁的对象必须是同一个

死锁

双方都需要当前对方所拥有的锁资源

package syn;public class DeadLock_ {public static void main(String[] args) {DeadLockDemo deadLockDemo = new DeadLockDemo(false);DeadLockDemo deadLockDemo1 = new DeadLockDemo(true);deadLockDemo1.start();deadLockDemo.start();}
}class DeadLockDemo extends Thread
{static Object o1 = new Object();static Object o2 = new Object();boolean flag;public DeadLockDemo(boolean flag) {this.flag = flag;}@Overridepublic void run() {if(flag){synchronized (o1){System.out.println(Thread.currentThread().getName() + "进入了o1");synchronized (o2){System.out.println(Thread.currentThread().getName() + "进入了o2");}}}else{synchronized (o2){System.out.println(Thread.currentThread().getName() + "进入了o2");synchronized (o1){System.out.println(Thread.currentThread().getName() + "进入了o1");}}}}
}

1.png

释放锁

释放锁
2.png
不会释放锁
3.png

相关文章:

Java进程(基础)

基本概念 1、进程&#xff1a;程序的执行过程 2、线程&#xff1a;一个进程可以有单个线程也就是我们说的单线程&#xff0c;还可以有多个线程也就是我们说的多线程&#xff0c; 线程 1、当一个类继承了Thread类就可以当成一个线程用 2、我们会重写run方法写上我们自己的业务…...

Android之 Activity活动详解

一 四大组件 1.1 Activity组件&#xff0c;它一个单独的窗口&#xff0c;程序流程都必须在Activity中运行。 1.2 service组件&#xff0c;用于在后台完成用户指定的操作。 1.3 content provider组件&#xff0c;会为所有的应用准备一个内容窗口&#xff0c;并且保留数据库、…...

车载软件架构——闲聊几句AUTOSAR BSW(五)

我是穿拖鞋的汉子,魔都中坚持长期主义的工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 我们并不必要为了和谐,而时刻保持通情达理;我们需要具备的是,偶尔有肚量欣然承认在某些方面我们可能会有些不可理喻。该有主见的时候能掷地有声地镇得住场…...

APP图标尺寸规范一文了解清楚

在进行图标设计前&#xff0c;熟知手机 app 图标尺寸规范&#xff0c;能更好地去针对不同平台设计出更极致的图标。当前智能手机系统主要以 iOS 及 Android 为主&#xff0c;APP 图标是产品给用户的第一印象&#xff0c;图标视觉设计的美感与吸引力&#xff0c;与用户是否选择下…...

写给程序员Android Framework 开发,

前言 在 Android 开发者技能中&#xff0c;如果想进大厂&#xff0c;一般拥有较好的学历可能有优势一些。但是如果你靠硬实力也是有机会的&#xff0c;例如死磕Framework。Framework 知识广泛应用在Android各个领域中&#xff0c;重要性显而易见。 成为一名Android Framework…...

html实现一个一闪一闪的按钮,CSS实现一个一闪一闪的按钮,Css闪烁点标,css设置按钮层次感,css按钮美化,CSS按钮动画过渡,CSS按钮添加阴影

效果 动态 静态 实现 底部多加了几个过渡按钮 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><style>#app {margin: 2% auto;text-align: center;}.lay-btn-box {position: relative;display: …...

品优购项目学习记录04--列表页

文章目录 1.品优购项目列表页制作准备工作2.列表页header和nav修改2.1 秒杀logo的制作2.2 导航栏nav修改 3.列表页主体sk_container 1.品优购项目列表页制作准备工作 1.列表页面是新的页面&#xff0c;我们需要新建页面文件list.html 2.因为列表页的头部和底部基本一致&#x…...

script标签type值application/json,importmap和module

type&#xff08;默认text/javascript&#xff09; 该属性定义 script 元素包含或src引用的脚本语言。属性的值为 MIME 类型&#xff08;媒体类型&#xff09;&#xff1b; 如果没有定义这个属性&#xff0c;脚本会被视作 JavaScript。 如果 MIME 类型不是 JavaScript 类型&a…...

基于ArcGIS实现陕西省1:250000比例尺地形图分幅和编号

1地形图的分幅与编号原理 我国1:1000000地形图的分幅采用国际1:1000000地图分幅标准&#xff0c;而其他比例尺地形图分幅以1:1000000比例尺地形图为基准进行分幅。每幅1:1000000地形图范围是经差6、纬差4&#xff1b;纬度60~ 76之间经差12、纬差4&#xff1b;纬度76~ 88之间经…...

校园安全,一键报警主机助力保障

校园安全&#xff0c;一键报警主机助力保障 随着社会发展和科技进步&#xff0c;校园安全问题日益受到重视。如何保障师生们的安全成为了学校一项重要任务。而校园可视一键报警主机就是一种非常有效的安保设备。 这种报警主机集合了视频监控、安全防范、数据处理等多个功能&a…...

RabbitMQ养成记 (7. 消息可靠性投递)

消息可靠性 什么是消息的可靠性呢&#xff1f;&#xff1f; 简单来说就是 你的消息发放给 exchange 这个过程中 有可能丢失或者失败 这时候需要一个回调机制来监控 发送结果 必要时还要返回信息。 rabbitmq 给我们提供了两种&#xff1a; 首先是生产者到exchange发送过程的监…...

SpringBoot配置连接两个或多个数据库

在Spring Boot应用中连接多个数据库或数据源可以使用多种方式&#xff0c;下面介绍两种常用的方法&#xff1a; 1、使用Spring Boot官方支持的多数据源配置 Spring Boot提供了官方支持的多数据源配置&#xff0c;可以简单地配置和管理多个数据源。 需要在application.proper…...

Python面试题汇总:高效备战技巧

Python面试题汇总&#xff1a;高效备战技巧 一、基础知识准备1 语言特点及优缺点2 数据类型3 运算符4 控制流程语句5 函数 二、面向对象编程1 面向对象编程基础2 类的创建及继承3 魔术方法4 多态5 设计模式 三、常用数据结构与算法1 字符串、列表、字典、集合字符串列表字典集合…...

如何区分比特率、波特率和频谱带宽?

01、什么是比特率和波特率&#xff1f; 宽带网络里面提及的千兆即1000Mbit/s&#xff0c;一般描述的是我们家网络端口每秒最大可接收0、1比特&#xff08;bit&#xff09;的数量&#xff0c;即每秒可接收1000x106个比特。显而易见&#xff0c;比特率越高&#xff0c;每秒传送的…...

sklearn中的特征工程(过滤法、嵌入法和包装法)

目录 ​编辑特征工程的第一步&#xff1a;理解业务 Filter过滤法 ​编辑方差过滤 ​编辑- 相关性过滤 - 卡方过滤 - F检验 - 互信息法 ​编辑嵌入法&#xff08;Embedded&#xff09; 包装法&#xff08;Wrapper&#xff09; 特征工程的第一步&#xff1a;理解业务 如…...

Linux C/C++并发编程实战(0)谈谈并发与并行

作为并发编程的第一讲&#xff0c;比较轻松&#xff0c;我们先来谈谈什么是并发和并行。 并发&#xff08;Concurrency&#xff09;是指一个处理器同时处理多个任务。 并行&#xff08;Parallelism&#xff09;是指多个处理器或者是多核的处理器同时处理多个不同的任务。 并发…...

2023年5月天津/南京/成都/深圳CDGA/CDGP数据治理认证报名

6月18日DAMA-CDGA/CDGP数据治理认证考试开放报名中&#xff01; 考试开放地区&#xff1a;北京、上海、广州、深圳、长沙、呼和浩特、杭州、南京、济南、成都、西安。其他地区凑人数中… DAMA-CDGA/CDGP数据治理认证班进行中&#xff0c;报名从速&#xff01; DAMA认证为数据管…...

【MySQL】MySQL批量插入测试数据的几种方式

文章目录 前言一、表二、使用函数生成设置允许创建函数产生随机字符串产生随机数字 三、创建存储过程插入角色表插入用户表 四、执行存储过程小结五、使用 Navicat自带的数据生成 前言 在开发过程中我们不管是用来测试性能还是在生产环境中页面展示好看一点, 又或者学习验证某…...

PowerShell install 一键部署virtualbox

VirtualBox 前言 VirtualBox 是一款开源虚拟机软件。VirtualBox 是由德国 Innotek 公司开发&#xff0c;由Sun Microsystems公司出品的软件&#xff0c;使用Qt编写&#xff0c;在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。Innotek 以 GNU General Public Licens…...

CTF权威指南 笔记 -第四章Linux安全机制-4.1-Stack Canaries

目录 Stack Canaries 简介 我们进行简单的例子 64 32 checksec Stack Canaries 是对抗栈溢出攻击的技术 SSP安全机制 Canary 的值 栈上的一个随机数 在程序启动时 随机生成并且保存在比返回地址更低值 栈溢出是从低地址向高地址进行溢出 如果攻击者要攻击 就一定要覆…...

智能车全向组圆环处理实战:从识别到出环的完整状态机设计

1. 智能车圆环处理的挑战与状态机设计思路 第一次参加智能车比赛时&#xff0c;圆环处理简直是我的噩梦。记得当时连续熬了三个通宵&#xff0c;就是为了解决车子在圆环里"迷路"的问题。后来才发现&#xff0c;把整个圆环过程拆分成多个状态&#xff0c;用状态机来管…...

安全研究 # 实践:二进制成分分析(Binary SCA)在嵌入式固件安全检测中的应用

1. 二进制成分分析(Binary SCA)是什么&#xff1f; 当你拿到一个嵌入式设备的固件文件&#xff0c;比如路由器、智能摄像头或者工控设备的升级包&#xff0c;有没有想过这里面到底藏了哪些"秘密"&#xff1f;Binary SCA就像是个专业的"拆弹专家"&#xff0…...

PP-DocLayoutV3助力学术出版:LaTeX论文手稿的自动排版分析

PP-DocLayoutV3助力学术出版&#xff1a;LaTeX论文手稿的自动排版分析 每次看到那些排版精美、公式复杂的学术论文&#xff0c;你是不是也好奇过&#xff0c;这些文档里的结构信息——比如哪部分是标题、哪部分是公式、参考文献又在哪里——能不能被机器自动识别出来&#xff…...

IndexTTS2 V23实战体验:上传音频秒变同款语气,效果惊艳

IndexTTS2 V23实战体验&#xff1a;上传音频秒变同款语气&#xff0c;效果惊艳 最近在语音合成圈子里&#xff0c;IndexTTS2的V23版本成了热门话题。大家都在讨论它那个“上传音频秒变同款语气”的功能到底有多神奇。作为一个对AI语音技术保持关注的技术爱好者&#xff0c;我第…...

轻榴浏览器:仅几MB的“轻功高手“,还你清净无扰的上网自由!

手机浏览器越来越臃肿——动辄几百MB的安装包&#xff0c;后台偷偷跑流量&#xff0c;刚搜个商品就收到精准广告推送&#xff0c;更别提那些关不掉的新闻资讯和弹窗骚扰……在这个"重口味"的浏览器时代&#xff0c;轻榴浏览器像一股清流逆势而来。这款体积小巧、基于…...

2007-2020年税调与上市公司匹配结果

结合税收调查数据与上市公司数据的变量&#xff0c;得到2007&#xff5e;2020 年税调与上市公司匹配结果。 匹配方法&#xff1a; 首先根据企业名称进行匹配。为便于两个数据集的连接&#xff0c;我在税调数据中生成了 sdid 变量以在匹配过程中识别每个观测值。使用精确匹配&…...

从libil2cpp.so到Frida脚本:一次完整的Unity手游内存修改逆向分析记录

从libil2cpp.so到Frida脚本&#xff1a;Unity手游内存修改实战解析 当你在玩一款单机手游时&#xff0c;是否曾想过那些看似简单的数值背后隐藏着怎样的代码逻辑&#xff1f;作为一名移动安全研究员&#xff0c;我最近对一款采用Unity IL2CPP模式构建的热门单机手游进行了逆向分…...

2026年私域SCRM工具选型对比:场景适配、功能

AI驱动的私域运营工具成为主流。对于全渠道连锁门店、中大型品牌商家以及重视私域深度运营的企业而言&#xff0c;选择一款适配自身业务场景的SCRM工具&#xff0c;直接关系到会员复购率、运营效率和私域资产沉淀效果。本文基于真实案例数据与产品能力对比&#xff0c;为您提供…...

Smart SVN vs. 其他SVN客户端:我们为什么选择它作为团队的主力版本控制工具?

Smart SVN&#xff1a;为什么它成为中小团队版本控制的首选利器&#xff1f; 当团队规模从三五人扩展到十几人时&#xff0c;代码版本管理的复杂度往往呈指数级增长。我们团队在经历了几次严重的合并冲突后&#xff0c;开始系统性地评估各类SVN客户端工具。经过三个月的实际测试…...

大模型面试复盘:从0基础到收获4个Offer,我的转行避坑指南!

离最后一场面试过去一段时间了&#xff0c;是时候做一个小小的复盘。 从4月份开始自学大模型&#xff0c;最开始我连llm是什么都不知道。我的路线是先做定位为大模型应用。每天下班学几个小时。 从4月到11月&#xff0c;基本就是学基础&#xff0c;总结八股&#xff0c;看书&am…...