Java多线程不会?一文解决——
方法一
- 新建类如MyThread继承Thread类
- 重写run()方法
- 再通过new MyThread类来新建线程
- 通过start方法启动新线程
案例:
class MyThread extends Thread {public MyThread(String name) {super(name);}@Overridepublic void run() {for(int i=0;i<10;i++){System.out.println(this.getName() + " " + i );}}}主类:MyThread myThread1 = new MyThread("Thread-1");MyThread myThread2 = new MyThread("Thread-2");MyThread myThread3 = new MyThread("Thread-3");myThread1.start();myThread2.start();myThread3.start();
常用方法
- static void sleep(T):让当前线程睡T毫秒
- static void yield():当前线程从运行变为就绪状态,重新争夺cpu
- void run():执行线程中run()方法(在当前线程中执行)
- void start():开启一个新的线程执行run()方法
- void setName():设置这个线程的名称
- String getName():获取当前线程的名称
- void interrupt():中断执行的子线程
- void join():等该线程执行完后,再执行当前线程
例:

当前主线程需等待t01,t02,t03线程执行完后再执行。
方法二
- 创建新类MyThread实现Runnable接口
- 实现接口中的run方法
- 创建MyThread对象,再新建Thread对象,将MyThread对象作为构造方法的参数传入Thread
- 通过start方法启动新的线程
案例:
class MyThread implements Runnable {@Overridepublic void run() {for(int i=0;i<10;i++){System.out.println(Thread.currentThread().getName() + " " + i );}}
}
主类main方法中MyThread myThread1 = new MyThread();Thread myThread2 = new Thread(myThread1);Thread myThread3 = new Thread(myThread1);myThread2.start();myThread3.start();
方法三
- 新建类MyThread实现Callable接口
- 实现接口中的call方法(有返回值)
- 创建MyThread对象,创建FutureTask对象将MyThread对象当作构造方法参数传入
- 创建Thread对象将FutureTask对象当构造方法参数传入(类似方法二第三步)
- 通过start方法启动新线程
- 通过FutureTask对象get方法获取返回结果
案例:
class MyThread implements Callable{@Overridepublic Object call() throws Exception {for(int i=0;i<10;i++){System.out.println(Thread.currentThread().getName() + " " + i );}Thread.sleep(5000);return 10+20;}
}main方法中:FutureTask futureTask = new FutureTask(new MyThread());Thread thread = new Thread(futureTask);thread.start();Object result = futureTask.get();System.out.println("执行结果:"+result);
实际过程中会出现多线程相关问题,比如两个线程同时操控一个实例变量或共享变量,可能会存在数据不一致等问题。
编程模型
同步编程模型:线程一执行必须等待线程二执行结束,或相反,两个线程发生了等待关系。
异步编程模型:线程一和线程二同时执行。
解决方法
方法一
synchronized(锁的内容,通常为全局唯一例如类main.class){
执行的内容
}
方法二
通过Lock lock = new ReentrantLock()对象来上锁
lock.lock();//上锁
执行的内容
lock.unlock();//解锁
守护线程
一般是一个死循环,所有用户结束,守护线程也就结束。
开启方法
void setDaemon(true);
方法四
通过wait()和notify(),notifyAll()方法等待和唤醒线程。
线程池
多线程运行时,系统不断创建和销毁新的线程,成本非常高,使用线程池就是最好的选择。
创建
ExecutorService threadPoll = Executors.newCachedThreadPool();
threadPoll.execute(对象):线程池指派一个线程执行该对象run方法。
关闭线程池
threadPoll.shutdown();
多把锁
创建
CountDownLatch countDownLatch = new CountDownLatch(锁的数量);
锁数量减少
countDownLatch.countDown(); //锁的数量减一
等待
countDownLatch.await():等待子线程执行完再执行(锁的数量为0)
感谢观看——
相关文章:
Java多线程不会?一文解决——
方法一 新建类如MyThread继承Thread类重写run()方法再通过new MyThread类来新建线程通过start方法启动新线程 案例: class MyThread extends Thread {public MyThread(String name) {super(name);}Overridepublic void run() {for(int i0;i<10;i){System.out.…...
Mac上pyenv的安装及使用
Mac上pyenv的安装及使用 安装 brew update brew install pyenv 报错 git -C /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core fetch --unshallowgit -C /usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask fetch --unshallow那就执行这2句 还报错 git -C /…...
【SpringBoot】IDEA查看spring bean的依赖关系
前因:研究springcloud config组件时,我发现config-server包下的EnvironmentController不在扫描的包路径下却可以响应客户端的请求,这引起了我的注意,我的问题是:EnvironmentController是怎么被添加进bean工厂的。本章就…...
项目代码优化(1)——下单逻辑
给一个电商开发的系统排查,发现漏洞很多。很多经验不够的开发者很容易忽视的逻辑错误陷阱。在给一个项目做二次开发时候,检测到的相关经典案例。这里整理支付和产品相关的逻辑,方便后续查看。,这里进行一些简单的逻辑漏洞梳理与修…...
探索 WebKit 的缓存迷宫:深入理解其高效缓存机制
探索 WebKit 的缓存迷宫:深入理解其高效缓存机制 在当今快速变化的网络世界中,WebKit 作为领先的浏览器引擎之一,其缓存机制对于提升网页加载速度、减少服务器负载以及改善用户体验起着至关重要的作用。本文将深入探讨 WebKit 的缓存机制&am…...
JVM:介绍
文章目录 一、什么是JVM二、JVM的功能1、解释和运行2、内存管理3、即时编译 三、常见的JVM四、Java虚拟机规范五、HotSpot发展历程 一、什么是JVM JVM的全称为Java Virtual Machine,Java虚拟机。本质上是一个运行在计算机上的程序,职责是运行Java字节码…...
和鲸“101”计划领航!和鲸科技携手北中医,共话医学+AI 实验室建设及创新人才培养
为进一步加强医学院校大数据管理与应用、信息管理与信息系统,医学信息工程等专业建设,交流实验室建设、专业发展与人才培养经验,6 月 22 日,由北京中医药大学(简称“北中医”)主办,上海和今信息…...
Linux 网络抓包工具tcpdump编译
tcpdump 的编译步骤 1. 下载源代码 访问 tcpdump 的官方网站(如:http://www.tcpdump.org/)下载最新的源代码压缩包,如tcpdump-4.9.2.tar.gz(注意版本号可能会有所不同)。 2. 解压缩源代码 使用 tar 命令…...
『C++成长记』string模拟实现
🔥博客主页:小王又困了 📚系列专栏:C 🌟人之为学,不日近则日退 ❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、存储结构 二、默认成员函数 📒2.1构造函数 📒2.…...
【c++】C++ IO流
本专栏内容为:C学习专栏,分为初阶和进阶两部分。 通过本专栏的深入学习,你可以了解并掌握C。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:C 🚚代码仓库:小小unicorn的代码仓库&…...
解密智慧校园基础数据的学年管理功能
在智慧校园平台中,学年管理模块构成了教育活动有序运行的基石,它精心设计来适应多样化的学术日程,确保学校的各项事务都能在清晰规划的学年框架内顺利推进。这一核心功能不仅关乎时间的界定,更深层次地融入了教育管理的每一个细微…...
Python酷库之旅-第三方库Pandas(009)
目录 一、用法精讲 19、pandas.read_xml函数 19-1、语法 19-2、参数 19-3、功能 19-4、返回值 19-5、说明 19-6、用法 19-6-1、数据准备 19-6-2、代码示例 19-6-3、结果输出 20、pandas.DataFrame.to_xml函数 20-1、语法 20-2、参数 20-3、功能 20-4、返回值 …...
VPN 的入门介绍
VPN(虚拟专用网络) 简介 虚拟专用网络,简称虚拟专网(VPN),其主要功能是在公用网络上建立专用网络,进行加密通讯。在企业网络中有广泛应用。VPN网关通过对数据包的加密和数据包目标地址的转换实…...
移动UI: 什么特征会被认为是简洁风格,用案例告诉你
什么是简洁风格,恐怕一百个人有一百个是理解,本文通过理论分析案例的方式进行探讨。 移动 UI 中的简洁风格通常具有以下几个特征: 1. 平面化设计: 简洁风格的移动 UI 善于运用平面化设计,即去除过多的阴影、渐变和立…...
除了伦敦外,英国还有这些热门留学城市
在同学们选择出国留学时,首先要考虑到的便是择校的问题。除了排名、专业、录取要求之外,城市因素也占据了很大比重。 抛开学校自身的优势外,一座城市的氛围、成本、环境都是需要考虑的因素。下面就我们来盘点一下英国热门的留学城市。 爱丁…...
2390. 从字符串中移除星号
2390. 从字符串中移除星号 题目链接:2390. 从字符串中移除星号 代码如下: class Solution { public:string removeStars(string s) {vector<char> sta;for(int i0;i<s.size();i){if(s[i]*) {sta.pop_back();}else {sta.push_back(s[i])…...
UNION、UNION ALL、INTERSECT、MINUS
UNION、UNION ALL、INTERSECT、MINUS? 说明 UNION:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;IUNION ALL:对两个结果集进行并集操作,包括重复行,不进行排序&am…...
Perl 语言开发(九):深入探索Perl语言的文件处理
目录 1. 文件打开与关闭 1.1 打开文件 1.2 关闭文件 2. 读取文件内容 2.1 逐行读取 2.2 一次性读取整个文件 3. 写入文件内容 3.1 覆盖写入 3.2 追加写入 4. 文件测试操作 4.1 文件测试运算符 5. 文件路径操作 5.1 文件路径处理模块 5.2 获取文件路径信息 6. 文…...
稀疏之美:在Mojo模型中实现特征的稀疏表示
稀疏之美:在Mojo模型中实现特征的稀疏表示 在机器学习领域,特征的稀疏表示是一种高效的数据编码方式,尤其适用于具有大量特征和缺失值的数据集。稀疏表示使用特殊的数据结构来存储和处理数据,从而减少内存占用和提高计算效率。Mo…...
如何大幅减少 Vue.js 中的包大小和加载时间,提升用户体验!
大家好,我是CodeQi! 一位热衷于技术分享的码仔。 你知道吗,根据Google 的一项研究,如果网站加载时间超过 3 秒,53% 的移动用户会离开该网站? 性能优化是一个经常讨论的话题,但很多开发人员并不关心提高应用的速度。 在前端开发中,优化包大小和加载时间对于提升用户体…...
嵌入式调试实战:常见错误与高效排查方法
1. 程序员调试中的那些"荒唐"错误 作为一名从业多年的嵌入式工程师,我深知调试过程中的酸甜苦辣。那些看似简单的问题往往耗费我们最多时间,而最终解决方案却常常让人哭笑不得。今天就来分享几个真实的调试故事,希望能给同行们带来…...
GD32F407标准库工程创建全流程:从官网固件库下载到Keil5编译通过
GD32F407标准库工程创建全流程:从官网固件库下载到Keil5编译通过 第一次接触GD32F407开发板时,最让人头疼的就是如何快速搭建开发环境。与STM32不同,GD32的官方资源分散,标准库文件结构复杂,新手很容易在文件复制和工程…...
Cisco Packet Tracer实战:从零搭建一个带冗余和ACL策略的企业网络(附完整配置命令)
Cisco Packet Tracer企业网络实战:冗余架构与ACL策略深度解析 第一次在Packet Tracer中搭建完整企业网络时,我被VLAN间通信、HSRP热备切换和ACL策略的连锁反应彻底难住了。记得那个深夜,当错误配置的ACL导致整个财务部门网络瘫痪时࿰…...
别再手动量了!用Python+Open3D给BIM模型做‘CT扫描’,自动揪出施工误差(附完整代码)
BIM模型质量检测革命:PythonOpen3D实现毫米级施工误差智能分析 施工现场的质量控制一直是建筑行业的核心痛点。传统靠人工抽检的方式不仅效率低下,还容易遗漏隐蔽问题。想象一下,如果能把BIM模型当作"数字孪生体",用三维…...
Go语言中的正则表达式
Go语言中的正则表达式 1. 正则表达式的基本概念 正则表达式是一种用于匹配字符串中字符组合的模式。在Go语言中,正则表达式通过regexp包来实现。 2. 基本用法 2.1 编译正则表达式 package mainimport ("fmt""regexp" )func main() {// 编译正则…...
bilibili-api技术解析:如何解决视频标识符转换核心问题
bilibili-api技术解析:如何解决视频标识符转换核心问题 【免费下载链接】bilibili-api 哔哩哔哩常用API调用。支持视频、番剧、用户、频道、音频等功能。原仓库地址:https://github.com/MoyuScript/bilibili-api 项目地址: https://gitcode.com/gh_mir…...
河海大学819传热学考研复试备考资料(新能源学院·清洁能源技术专硕专用)
温馨提示:文末有联系方式【权威备考】河海大学819传热学复试专属资料包 本资料由2025届成功录取河海大学新能源学院清洁能源技术专业硕士的学长亲自整理,初试与复试综合成绩稳居前三,内容高度贴合最新考核趋势。【高效提分利器】核心资料全覆…...
2026年4月OpenClaw(Clawdbot)一键部署及接入Skills保姆级教程,让OpenClaw(个人AI助手) 7*24 小时为你工作!
2026年4月OpenClaw(Clawdbot)一键部署及接入Skills保姆级教程,让OpenClaw(个人AI助手) 7*24 小时为你工作!OpenClaw(原Clawdbot)作为2026年主流的AI自动化助理平台,可通过阿里云轻量服务器实现7…...
Kandinsky-5.0-I2V-Lite-5s从零开始:非技术用户也能3分钟生成首个5秒动态视频
Kandinsky-5.0-I2V-Lite-5s从零开始:非技术用户也能3分钟生成首个5秒动态视频 1. 认识Kandinsky-5.0-I2V-Lite-5s Kandinsky-5.0-I2V-Lite-5s是一款专为普通用户设计的轻量级图生视频工具。它的最大特点是简单易用——你只需要准备一张图片和一句话,就…...
测试文章标题最终版
测试文章内容这是一篇测试文章...
