深圳外贸行业/李勇seo的博客
后台线程
一个进程中只有后台进程运行,该进程将会结束。
新创建的线程默认为前台线程,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…...

HistoQC|病理切片的质量控制工具
小罗碎碎念 这期推文介绍的内容,我相信研究病理组学的人,一定都非常熟悉——HistoQC——病理切片的质量控制。 之前写过Hover Net系列的推文,反响还可以,但是Hover Net是用于细胞核检测和分类的,直接从这里开始还不够系…...

C/C++ - 编码规范(USNA版)
[IC210] Resources/C Programming Guide and Tips 所有提交的评分作业(作业、项目、实验、考试)都必须使用本风格指南。本指南的目的不是限制你的编程,而是为你的程序建立统一的风格格式。 * 这将有助于你调试和维护程序。 * 有助于他人&am…...

leetcode刷MySQL记录——sum/count里加条件判断、avg求满足条件记录数占比
leetcode题目:1934. 确认率 在刷leetcode的MySQL题中,从题目的题解知道了count和avg聚合函数的另外用法,在此记录。 count() 里加条件判断 count函数用于统计在符合搜索条件的记录中,指定的表达式expr不为NULL的行数有多少&…...

PHP的SHA256WithRSA签名和Curl POST请求函数
getCustomerEncryptionKey - 获取加密秘钥 /** * 获取加密秘钥 * param array $params * return string */ public function getCustomerEncryptionKey(array $params): string { //1.ASCII码(字典序-升序)排序…...

5G RAN
两个entity:NodeB、UE entity之间传输数据的东东 entity内部的流水线岗位:L3/L2/L1 岗位之间是消息交互/信令交互...

Mybatis动态sql标签
动态SQL标签简介: MyBatis的一个强大的特性之一通常是它的动态SQL能力。如果你有使用JDBC或其他相似框架的经验,你就明白条件地串联SQL字符串在一起是多么的痛苦,确保不能忘了空格或在列表的最后省略逗号。动态SQL可以彻底处理这种痛苦。 Mybatis中实现动态sql的标签有&#x…...

Linux CentOS Suhosin禁用php5.6版本eval函数详细图文教程
方法一:PHP_diseval_extension禁用 Linux CentOS 禁用php的eval函数详细图文教程_centos php 禁用 eval-CSDN博客 这个方法make报错,懒得费时间处理,直接用第二种 方法二:suhosin禁用 服务器只装了一个PHP5.6版本,一…...

这5招底层逆袭玄学,一个人越来越厉害的秘诀
在这个充满机遇与挑战的时代,每个人都渴望能够逆袭成功,摆脱底层的束缚,成为人生赢家。 然而,现实往往是残酷的,许多人在追逐梦想的路上遭遇挫折,甚至迷失了方向。 那么,有没有一些"…...

MySQL自学教程:1. MySQL简介与安装
MySQL简介与安装 一、MySQL简介二、MySQL安装(一)Windows系统上的安装(二)Linux系统上的安装(以Ubuntu为例)(三)Mac OS系统上的安装三、安装后的基本配置四、总结一、MySQL简介 MySQL是一个流行的开源关系型数据库管理系统(RDBMS),广泛应用于各种业务场景,从小型个…...

Jenkins多stage共享同一变量方式
在第一个stage中为这个变量赋值,在其它stage中使用这个变量 import java.nio.file.Files import java.nio.file.Path import java.nio.file.Paths import java.nio.file.StandardCopyOption import groovy.json.JsonOutput import groovy.json.JsonSlurper// 共享的…...