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% 的移动用户会离开该网站? 性能优化是一个经常讨论的话题,但很多开发人员并不关心提高应用的速度。 在前端开发中,优化包大小和加载时间对于提升用户体…...
数组专项(一):数组排序、去重、查找
大家好,欢迎来到《算法面试60讲(2026最新版全真题带解析)》第19篇!上一篇我们彻底吃透了字符串专项的核心难点——BF暴力匹配与KMP高效匹配算法,搞定了字符串模块面试最难的算法考点。从本节课开始,我们正式进入算法面试第一高频模块:数组专项。 在算法面试中,数组是出…...
Arduino PWM转4-20mA工业电流信号:二阶滤波与V/I转换电路设计
1. 项目概述:从PWM到工业标准电流信号在工业自动化、过程控制和传感器领域,4-20 mA电流环是一个几乎无处不在的标准。它用4 mA代表测量值的下限(如0C),20 mA代表上限(如100C),这种设…...
全链路压测实战:双十一级别的流量,我是这样扛住的
作为一名在质量保障领域摸爬滚打多年的测试工程师,我深知传统的单接口压测在如今分布式架构下的无力感。当业务流量达到双十一这种脉冲式、高并发的级别时,任何一个非核心链路上的“短板”都可能引发系统性的雪崩。全链路压测不再是选择题,而…...
第三卷第4章:原型模式设计思想
第三卷第4章:原型模式设计思想 目录介绍 01.案例引入与思考 1.1 痛点场景 1.2 它哪里不舒服 1.3 引出本篇主角 02.原型模式介绍 2.1 原型模式由来 2.2 原型模式定义...
手把手教你用Mind+和Blynk,让手机轻松遥控掌控板(含自建服务器避坑指南)
从零搭建物联网控制平台:Mind与Blynk深度整合实战 当你第一次尝试用手机控制硬件设备时,那种"隔空取物"的奇妙感总会让人兴奋不已。想象一下,躺在沙发上就能调节书桌上的智能台灯亮度,或者在外出时随时查看家中的温湿度…...
基于PIC32的嵌入式MIDI合成器:从波表合成到硬件实现
1. 项目概述:一个基于嵌入式微控制器的MIDI声音合成器如果你对电子音乐制作、嵌入式开发,或者DIY硬件合成器感兴趣,那么“REMI Synth”这个项目绝对值得你花时间深入了解。它本质上是一个数字单音MIDI控制的声音合成器,核心是一块…...
基于Cynthion逆向USB协议,为DP100电源开发Linux控制软件
1. 项目概述:用Cynthion嗅探USB,为DP100电源打造Linux软件作为一名长期在Linux环境下折腾硬件和嵌入式开发的爱好者,我经常遇到一个头疼的问题:很多不错的桌面小设备,比如电源、示波器、逻辑分析仪,它们的官…...
通用物联网开发板设计:基于ESP8266的硬件集成与开发实践
1. 项目概述:为什么我们需要一块“通用”的物联网开发板?在捣鼓了几年物联网项目之后,我发现自己桌面上堆满了各种开发板:ESP8266、ESP32、Arduino Uno、STM32 Nucleo……每个项目都要重新连线、配置电源、焊接传感器接口…...
如何利用开源工具Unlock-Music解决音乐平台加密格式兼容问题
如何利用开源工具Unlock-Music解决音乐平台加密格式兼容问题 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址: https://gi…...
从Stable Diffusion到DiT:为什么说Transformer是扩散模型的下一站?
从Stable Diffusion到DiT:Transformer如何重塑扩散模型的未来 在图像生成领域,扩散模型正经历着从U-Net架构向Transformer架构的范式转移。这一转变不仅仅是技术组件的简单替换,而是代表着生成式AI在可扩展性、训练效率和模型容量方面的重大突…...
