Java之线程相关应用实现
后台线程
一个进程中只有后台进程运行,该进程将会结束。
新创建的线程默认为前台线程,Java中只要有一个前台线程运行,就不会结束程序,如果只有后台线程运行,程序就会结束,可以在线程对象启动前执行setDaemon(true)语句设置该线程为后台线程。
class Main {public static void main(String[] args) {System.out.println("main()线程是后台线程吗"+Thread.currentThread().isDaemon());DaemonThread daemon=new DaemonThread();Thread thread=new Thread(daemon,"后台线程");System.out.println("Daemons是后台线程吗"+thread.isDaemon());thread.setDaemon(true);//设置为后台线程System.out.println("Daemons是后台线程吗"+thread.isDaemon());thread.start();//模拟主线程main执行int i=0;for(;i<3;i++){System.out.println(i);}}
}class DaemonThread implements Runnable {//模拟分线程执行public void run(){while(true){System.out.println(Thread.currentThread().getName()+"正在运行");}}}

线程的优先级
使用setPriority方法,设置优先级为1到10;数字越大,优先级越高,获得CPU的使用权机会越大。
class Main {public static void main(String[] args) {Thread minPriority =new Thread(new maxpriority(),"优先级较高线程");Thread maxPriority=new Thread(new minpriority(),"优先级较低线程");minPriority.setPriority(Thread.MIN_PRIORITY);//设置优先级为1maxPriority.setPriority(Thread.MAX_PRIORITY);//设置优先级为10//开启两个线程minPriority.start();maxPriority.start();}}
class maxpriority implements Runnable{public void run(){for(int i=0;i<3;i++) {System.out.println(Thread.currentThread().getName() + "正在输出" + i);}}}
class minpriority implements Runnable{public void run(){for(int i=0;i<3;i++) {System.out.println(Thread.currentThread().getName() + "正在输出" + i);}}
}

线程休眠
当前线程暂停运行,进入阻塞状态哦使用sleep()方法。传入参数单位为毫秒。
sleep调用时,只能让当前正在运行的线程休眠,
class Main {public static void main(String[] args) {new Thread(new Sleepthread()).start();//开启新线程for(int i=1;i<=8;i++){try{ if(i==5){Thread.sleep(1000);}System.out.println("主线程正在输出"+i);Thread.sleep(500);}catch(InterruptedException e){e.printStackTrace();}}}}
class Sleepthread implements Runnable{public void run(){for(int i=1;i<=8;i++){if(i==3){try{Thread.sleep(1000);}catch(Exception e){e.printStackTrace();}}System.out.println("Sleep线程正在输出"+i);try{ Thread.sleep(500);}catch(Exception e){e.printStackTrace();}}}
}

主线程在Sleep线程输出3之前连续输出2,3,4;说明此时Sleep线程在输出值3时先休眠了一段时间;
另外,Sleep线程再输出6之前,主线程也连续输出5,6;说明此时Sleep在输出6时休眠了一段时间。
线程插队
class Main {public static void main(String[] args) throws Exception {Thread thread=new Thread(new Joinrunable(),"thread");thread.start();for(int i=1;i<=4;i++){if(i==2){thread.join();//调用join()方法插队实现}System.out.println(Thread.currentThread().getName()+"线程正在输出"+i);}}
}
class Joinrunable implements Runnable{public void run(){for(int i=1;i<=3;i++){System.out.println(Thread.currentThread().getName()+"线程正在输出"+i);}}
}
main()线程和thread线程互相争夺CPU使用权,然后当i=3时候

线程生命周期的六种基本状态
(1)新建状态
创建一个线程对象后,还没有调用start()方法启动之前的状态
(2)可运行状态
就绪状态,调用了start()方法之后进入的状态。
(3)锁阻塞状态
当一个线程想要获取一个对象锁,该aii锁被其他线程持有,该线程进入锁阻塞状态。
(4)无限等待状态
一个线程等待另一个线程执行一个唤醒动作,该线程进入的状态。
(5)计时等待状态
具有指定等待时间的状态,一直保持到超时或被唤醒
(6)被终止状态
终止运行,由于正常退出或者异常没有被捕获而结束。
线程让步
某个特定时间点,线程暂停抢夺CPU,采用yield()方法实现。
class Main {public static void main(String[] args) throws Exception {//新建两个线程Thread th1=new Fieldthread("th1");Thread th2=new Fieldthread("th2");
//开启两个线程th1.start();th2.start();}
}
class Fieldthread extends Thread {public Fieldthread(String name) {super(name);//调用父类带参构造方法}public void run() {for(int i=1;i<4;i++){System.out.println(Thread.currentThread().getName()+"线程输出"+i);if(i==2){System.out.println("线程让步");//线程让步Thread.yield();}}}
}

线程中断
调用两种方法实现:
interrupt()方法和isInterrupted()方法
isInterrupted方法判断中断标志位,如果为真表示中断。
class Main {public static void main(String[] args) throws Exception {Thread thread=new Thread(new Runnable() {public void run() {for (int i = 0; i < 4; i++) {if(i==2){Thread.currentThread().interrupt();System.out.println("线程是否中断"+Thread.currentThread().isInterrupted());}}}});//创建实例对象thread.start();//启动线程}
}

线程同步
class Main {public static void main(String[] args) throws Exception {Salethread salethread = new Salethread();new Thread((salethread),"线程1").start();//创建并启动新线程new Thread((salethread),"线程2").start();//创建并启动新线程new Thread((salethread),"线程3").start();//创建并启动新线程}
}
class Salethread implements Runnable{private int tickets=10;public void run(){while(tickets>0){try{Thread.sleep(300);}catch(Exception e){e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"卖出票号是 "+tickets--);}}
}

结果的票数中出现了0;之所以这样是因为每个线程都会先调用sleep方法进入休眠一段时间。即假设票数为3时候,线程2先进入while循环,然后调用sleepf方法休眠一段时间,在此期间票数值不变,因为票数只有在最后输出时候才会减少,线程3进入while循环,然后调用sleep()方法休眠一段时间,于此同时然后线程1进入while循环,然后调用sleep()方法进入休眠,最后三个线程依次结束休眠状态,相继售票,即票数由3变化到0;
所以为了安全起见,使用同步代码块,使得多线程访问处理同一资源时候,任何时刻只能由一个线程访问处理。
将共享资源的代码放在synchronized(lock)关键字修饰的代码块中。
synchronized(lock){
处理共享资源的代码块
}
lock是指锁,即某个线程执行时,其他线程不能执行。
class Main {public static void main(String[] args) throws Exception {Salethread salethread = new Salethread();new Thread((salethread),"线程1").start();//创建并启动新线程new Thread((salethread),"线程2").start();//创建并启动新线程new Thread((salethread),"线程3").start();//创建并启动新线程}
}
class Salethread implements Runnable{private int tickets=10;Object lock=new Object();//定义锁public void run(){while(tickets>0){synchronized (lock) { try{Thread.sleep(300);}catch(Exception e){e.printStackTrace();}if(tickets>0){ System.out.println(Thread.currentThread().getName()+"卖出票号是 "+tickets--);}else{break;}}}}
}

同步方法
相关文章:
Java之线程相关应用实现
后台线程 一个进程中只有后台进程运行,该进程将会结束。 新创建的线程默认为前台线程,Java中只要有一个前台线程运行,就不会结束程序,如果只有后台线程运行,程序就会结束,可以在线程对象启动前执行setDae…...
一加全机型TWRP合集/橙狐recovery下载-20240603更新-支持一加12/Ace3V手机
TWRP是目前安卓平台的刷机神器,可快速刷写第三方ROM或官方系统,刷入TWRP之前需要解锁BL,目前已适配一加多个机型。ROM乐园小编20240603整理,涵盖一加1到一加Ace3V多机型专用TWRP文件,个人机型橙狐recovery适配相对完整…...
小伙子知道synchronized的优化过程吗
synchronized优化 背景:synchronized最初作为Java中的重量级锁,开销大,不被推荐使用。优化:随着JDK的发展,特别是JDK1.6以后,synchronized经历了优化,现在广泛应用于JVM源码和开源框架。 对象…...
鸿蒙面试心得
自疫情过后,java和web前端都进入了冰河时代。年龄、薪资、学历都成了找工作路上躲不开的门槛。 年龄太大pass 薪资要高了pass 学历大专pass 好多好多pass 找工作的路上明明阳关普照,却有一种凄凄惨惨戚戚说不清道不明的“优雅”意境。 如何破局&am…...
SQLite vs MySQL vs PostgreSQL对比总结
开发业务系统时,是绕不开RDBMS(关系型数据库)的。虽然现在诞生了各种NoSQL的数据库,RDBMS在业务系统中的严谨和优势依然无法取代。 近几年大大小小的项目中,常用的三种RDBMS(SQLite,MySQL&#…...
一种改进解卷积算法在旋转机械故障诊断中的应用(MATLAB)
轴承振动是随机振动。在不同的时刻,轴承振动值是不尽相同的,不能用一个确定的时间函数来描述。这是由于滚动体除了有绕轴承公转运动以外,还有绕自身轴线的自旋运动,且在轴承运转时,滚动接触表面形貌是不断变化的&#…...
分布式锁(4):jedis基于Redis setnx、get、getset的分布式锁
1 实现原理 setnx(lockkey, 当前时间+过期超时时间) ,如果返回1,则获取锁成功;如果返回0则没有获取到锁,转向步骤(2)get(lockkey)获取值oldExpireTime ,并将这个value值与当前的系统时间进行比较,如果小于当前系统时间,则认为这个锁已经超时,可以允许别的请求重新获取,…...
linux内存排查工具smem使用
smem 是一个强大的工具,用于分析 Linux 系统中各进程的内存使用情况。-r 和 -k 选项用于指定输出格式和单位。以下是这两个选项的详细解析: -r:按照进程的内存使用量进行排序,默认按 RSS(常驻内存集)排序。-k:将输出的内存单位设为千字节(KB)。使用 smem 的命令示例 …...
云主机相比物理机有哪些优势
随着信息技术的飞速发展,云计算技术逐渐成为现代企业的核心驱动力。其中,云主机作为云计算的重要组成部分,以其高性能、高可用性和灵活便捷的特性,成为企业IT架构的新选择。今天我们就来了解探讨云主机相比传统主机,有…...
ClickHouse-Keeper安装使用
1.rpm 安装 clickhouse-keeper rpm -ivh clickhouse-keeper-23.8.11.28.x86_64.rpm 2.修改keeper的配置文件 vi /etc/clickhouse-keeper/keeper_config.xml修改部分参数 1.可修改日志等存储路径 2.增加监听配置 <listen_host>0.0.0.0</listen_host> 3.server_id…...
全国产飞腾+FPGA架构,支持B码+12网口+多串电力通讯管理机解决方案
GMSL 摄像头 GMSL 是 Maxim 公司推出的一种高速串行接口,适用于视频、音频和控制信号的传输,使用 50Ω 同轴电缆或 100Ω 屏蔽双绞线(STP)电缆时的距离可达 15m 或更长。 Maxim 的方案分为 GMSL、 GMSL2以及GMSL3。GMSL2 跟 GMSL(一代)是兼容的ÿ…...
bat命令 批处理 脚本 windows DOS
常见命令解释 命令示例: 文件1.bat echo offstart notepad.exe timeout /t 5 /nobreak start notepad.exe pause echo 当前时间【%time%】 timeout /t 5 /nobreak echo 延时时间【%time%】 pause echo off 执行bat文件的时候,cmd黑框里不显示批处理…...
【云计算】阿里云、腾讯云、华为云RocketMQ、Kafka、RabbitMq消息队列对比
目录 一、云平台中间件关键信息对比 1、RocketMQ 2、Kafka 3、RabbitMQ 二、中间件详细信息 1、阿里云MQ (一)消息队列RocketMQ (二)消息队列Kafka (三)消息队列RabbitMQ 2、腾讯云MQ (一)消息队列RocketMQ (二)消息队列CKafka (三)消息队列RabbitMQ 3、华为云MQ…...
【JavaScript脚本宇宙】玩转数据存储:深入剖析提升 Web 应用程序性能的六大利器
从本地到云端:全面解析满足各种需求的高性能 JavaScript 数据库库 前言 本文将介绍几个流行的JavaScript数据库库,包括localForage、Dexie.js、PouchDB、LokiJS和NeDB。每个库都有自己的特点和适用场景。通过比较它们的功能和使用方式,可以…...
Web应用和Tomcat的集成鉴权2-Form Authentication
作者:私语茶馆 1.相关章节 1) Web应用和Tomcat的集成鉴权1-BasicAuthentication-CSDN博客 2) Web应用和Tomcat的集成鉴权2-Form Authentication-CSDN博客 集成鉴权+定制化登录 2.前言 上章讲述了Tomcat的Basic Authentication鉴权模式,可以让Web应用和Tomcat的鉴权集成起来…...
async、await 官宣:JavaScript 中的异步编程新纪元
【作者主页】:小鱼神1024 【擅长领域】:JS逆向、小程序逆向、AST还原、验证码突防、Python开发、浏览器插件开发、React前端开发、NestJS后端开发等等 async/await 是 ECMAScript 2017 标准中引入的一种用于处理异步操作的语法糖。它基于 Promise 和 Gen…...
日元跌破160大关,日本当局何时干预?
KlipC报道:6月26日,日元又跌了,美元兑日元跌破160的整关口,超过了4月日本官员在市场上干预的水平,创1986年来新低。美联储降息的可能性降低,市场预计日元有可能延续当前的弱势。 KlipC分析师David表示&…...
iptables(12)实际应用举例:策略路由、iptables转发、TPROXY
简介 前面的文章中我们已经介绍过iptables的基本原理,表、链的基本操作,匹配条件、扩展模块、自定义链以及网络防火墙、NAT等基本配置及原理。 这篇文章将以实际应用出发,列举一个iptables的综合配置使用案例,将我们前面所涉及到的功能集合起来,形成一个完整的配置范例。…...
phpMyAdmin 4.0.10 文件包含 -> getshell
phpMyAdmin 4.0.10 文件包含 -> getshell 前言:这里这个漏洞相对来说审计起来不是特别难,但是对于初学者还是有点挑战性的,从zkaq web课过来的小伙伴想挑战一下自己代码审计能力的话,可以直接跳到最后下载源码,聂风…...
Spring Boot中如何集成ElasticSearch进行全文搜索
Spring Boot中如何集成ElasticSearch进行全文搜索 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天,我们将探讨如何在Spring Boot应用中集成Elas…...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
【WebSocket】SpringBoot项目中使用WebSocket
1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖,添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...
C++ 类基础:封装、继承、多态与多线程模板实现
前言 C 是一门强大的面向对象编程语言,而类(Class)作为其核心特性之一,是理解和使用 C 的关键。本文将深入探讨 C 类的基本特性,包括封装、继承和多态,同时讨论类中的权限控制,并展示如何使用类…...
无需布线的革命:电力载波技术赋能楼宇自控系统-亚川科技
无需布线的革命:电力载波技术赋能楼宇自控系统 在楼宇自动化领域,传统控制系统依赖复杂的专用通信线路,不仅施工成本高昂,后期维护和扩展也极为不便。电力载波技术(PLC)的突破性应用,彻底改变了…...
用 FFmpeg 实现 RTMP 推流直播
RTMP(Real-Time Messaging Protocol) 是直播行业中常用的传输协议。 一般来说,直播服务商会给你: ✅ 一个 RTMP 推流地址(你推视频上去) ✅ 一个 HLS 或 FLV 拉流地址(观众观看用)…...
