Java Thread类详解
🙈作者简介:练习时长两年半的Java up主
🙉个人主页:程序员老茶
🙊 ps:点赞👍是免费的,却可以让写博客的作者开兴好久好久😎
📚系列专栏:Java全栈,计算机系列(火速更新中)
💭 格言:种一棵树最好的时间是十年前,其次是现在
🏡动动小手,点个关注不迷路,感谢宝子们一键三连
目录
- 课程名:Java
- 内容/作用:知识点/设计/实验/作业/练习
- 学习:Java Thread类详解
- Java Thread类详解
- 1. Thread类简介
- 2. 创建线程的方法
- 2.1 继承Thread类
- 2.2 实现Runnable接口
- 3. 线程的生命周期
- 4. 线程同步与通信
- 4.1 synchronized关键字
- 4.2 ReentrantLock
- 4.3 Semaphore
- 4.4 CountDownLatch
- 5. 总结
课程名:Java
内容/作用:知识点/设计/实验/作业/练习
学习:Java Thread类详解
Java Thread类详解
Java中的Thread类是一个核心类,它提供了多线程编程的基本功能。本文将详细解释Thread类及其常用方法,并通过代码示例进行演示。
1. Thread类简介
Thread类是Java中实现多线程的基类,它继承自Object类。每个线程都有一个对应的Thread对象,通过调用该对象的start()方法来启动线程,调用stop()方法来停止线程。
2. 创建线程的方法
2.1 继承Thread类
要创建一个线程,可以通过继承Thread类并重写其run()方法来实现。然后创建该子类的实例,并调用其start()方法启动线程。
class MyThread extends Thread {@Overridepublic void run() {// 线程执行的任务System.out.println("MyThread is running");}
}public class Main {public static void main(String[] args) {MyThread myThread = new MyThread();myThread.start(); // 启动线程}
}
2.2 实现Runnable接口
另一种创建线程的方式是通过实现Runnable接口并重写其run()方法。然后将实现了Runnable接口的类的实例作为参数传递给Thread类的构造函数,最后调用Thread对象的start()方法启动线程。
class MyRunnable implements Runnable {@Overridepublic void run() {// 线程执行的任务System.out.println("MyRunnable is running");}
}public class Main {public static void main(String[] args) {MyRunnable myRunnable = new MyRunnable();Thread thread = new Thread(myRunnable);thread.start(); // 启动线程}
}
3. 线程的生命周期
线程的生命周期包括以下五种状态:
- 新建(New):线程对象被创建后,还没有调用start()方法。
- 就绪(Runnable):线程对象调用了start()方法,但是还没有获得CPU时间片。
- 运行(Running):线程获得了CPU时间片,正在执行run()方法。
- 阻塞(Blocked):线程在等待锁的释放或者调用了sleep()、wait()等方法。
- 死亡(Terminated):线程执行完了run()方法或者因为异常而终止。
可以通过Thread类的getState()方法获取线程的状态。
public class Main {public static void main(String[] args) {MyThread myThread = new MyThread();System.out.println("Thread state: " + myThread.getState()); // 输出:Thread state: NEWmyThread.start();System.out.println("Thread state: " + myThread.getState()); // 输出:Thread state: RUNNABLE}
}
4. 线程同步与通信
线程同步与通信是多线程编程中的重要概念。Java提供了多种方式来实现线程之间的同步与通信,如synchronized关键字、ReentrantLock、Semaphore、CountDownLatch等。
4.1 synchronized关键字
synchronized关键字可以用于修饰方法或者代码块,确保同一时刻只有一个线程能够访问被修饰的资源。
class Counter {private int count = 0;public synchronized void increment() {count++;}public synchronized void decrement() {count--;}public synchronized int getCount() {return count;}
}
4.2 ReentrantLock
ReentrantLock是一个可重入的互斥锁,相比于synchronized关键字,它提供了更多的灵活性。
import java.util.concurrent.locks.ReentrantLock;class Counter {private int count = 0;private ReentrantLock lock = new ReentrantLock();public void increment() {lock.lock();try {count++;} finally {lock.unlock();}}public void decrement() {lock.lock();try {count--;} finally {lock.unlock();}}public int getCount() {lock.lock();try {return count;} finally {lock.unlock();}}
}
4.3 Semaphore
Semaphore是一个计数信号量,可以用来控制同时访问特定资源的线程数量。
import java.util.concurrent.Semaphore;class Counter {private int count = 0;private Semaphore semaphore = new Semaphore(1);public void increment() throws InterruptedException {semaphore.acquire();try {count++;} finally {semaphore.release();}}public void decrement() throws InterruptedException {semaphore.acquire();try {count--;} finally {semaphore.release();}}public int getCount() {return count;}
}
4.4 CountDownLatch
CountDownLatch是一个同步工具类,允许一个或多个线程等待其他线程完成操作。
import java.util.concurrent.CountDownLatch;public class Main {public static void main(String[] args) throws InterruptedException {int numThreads = 3;CountDownLatch latch = new CountDownLatch(numThreads);for (int i = 0; i < numThreads; i++) {new Thread(new Worker(latch)).start();}latch.await(); // 主线程等待其他线程完成任务System.out.println("All threads finished");}
}class Worker implements Runnable {private CountDownLatch latch;public Worker(CountDownLatch latch) {this.latch = latch;}@Overridepublic void run() {try {System.out.println(Thread.currentThread().getName() + " is working");Thread.sleep((long) (Math.random() * 1000)); // 模拟耗时操作System.out.println(Thread.currentThread().getName() + " finished");} catch (InterruptedException e) {e.printStackTrace();} finally {latch.countDown(); // 完成任务后,计数器减一}}
}
5. 总结
本文详细介绍了Java中Thread类的用法和常见方法,包括创建线程、线程的生命周期、线程同步与通信等。希望对您学习Java多线程编程有所帮助。
| 往期专栏 |
|---|
| Java全栈开发 |
| 数据结构与算法 |
| 计算机组成原理 |
| 操作系统 |
| 数据库系统 |
| 物联网控制原理与技术 |
相关文章:
Java Thread类详解
🙈作者简介:练习时长两年半的Java up主 🙉个人主页:程序员老茶 🙊 ps:点赞👍是免费的,却可以让写博客的作者开兴好久好久😎 📚系列专栏:Java全栈,…...
3_使用传统CNN网络训练图像分类模型
使用传统CNN网络训练图像分类模型 1. MNIST 首先,定义一下超参数等 import torch# dataset input_shape = 28 num_classes = 10# hyper batch_size = 64 num_epochs = 5 learning_rate = 1e-3# gpu device = torch.device(cuda...
Java 创建线程的方法
🙈作者简介:练习时长两年半的Java up主 🙉个人主页:程序员老茶 🙊 ps:点赞👍是免费的,却可以让写博客的作者开兴好久好久😎 📚系列专栏:Java全栈,…...
基于安卓android微信小程序的旅游app系统
项目介绍 随着人民生活水平的提高,旅游业已经越来越大众化,而旅游业的核心是信息,不论是对旅游管理部门、对旅游企业,或是对旅游者而言,有效的获取旅游信息,都显得特别重要.自助定制游将使旅游相关信息管理工作规范化、信息化、程序化,提供旅游景点、旅游线路,旅游新闻等服务本…...
C++设计模式-单件(Singleton)
目录 C设计模式-单件(Singleton) 一、意图 二、适用性 三、结构 四、参与者 五、代码 C设计模式-单件(Singleton) 一、意图 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 二、适用性 当类只能有一…...
想做好接口测试,先把这些概念搞清楚了
接口一般来说有两种,一种是程序内部的接口,一种是系统对外的接口。 系统对外的接口 比如你要从别的网站或服务器上获取资源或信息,别人肯定不会把数据库共享给你,他只能给你提供一个他们写好的方法来获取数据,你引用…...
通过融合UGV的地图信息和IMU的惯性测量数据,实现对车辆精确位置和运动状态的估计和跟踪研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
『Linux』Linux环境搭建 | 阿里云云服务器白嫖 | Xshell环境配置
🔥博客主页: 小羊失眠啦 🔖系列专栏: C语言、Linux 🌥️每日语录:时间,都是公平的,不公平的,只是现在的自己,对未来的自己。 ❤️感谢大家点赞👍收…...
C++ 类和对象篇(五) 析构函数
目录 一、概念 1. 析构函数是什么? 2. 为什么要有析构函数? 3. 怎么用析构函数? 3.1 创建析构函数 3.2 调用析构函数 二、特性 三、由编译器生成的默认析构函数 四、对象的析构顺序 1. 局部对象 2. new出来的堆对象 3. 全局对象 一、概念 1…...
find 与 cp 命令组合使用
查找到文件后,拷贝到指定路径 find ~/Downloads/ -name *.torrent -exec cp {} ~/Downloads/myTorrent \;\;前面有个空格,要注意,这是固定结构,请不要尝试改变 上面命令是在Downloads 目标中查找后缀为torrent所有文件࿰…...
用VLD调查VC内存泄漏
一、发现内存泄漏 使用VS2022,发现提示有内存泄漏,检查了所有的new,确认都有相应的delete释放。 Detected memory leaks! Dumping objects -> {1914} normal block at 0x0000021FDFFBD2E0, 48 bytes long.Data: < >…...
【Java 进阶篇】使用 JDBCTemplate 执行 DQL 语句详解
在前面的文章中,我们已经学习了如何使用 Spring 的 JDBCTemplate 执行 DML(Data Manipulation Language)操作,包括插入、更新和删除操作。现在,让我们来深入了解如何使用 JDBCTemplate 执行 DQL(Data Query…...
了解了spring mvc web容器中一个http请求的全过程,能给我们提升多少武力值
继上一篇文章什么,这年头还有人不知道404_cow__sky的博客-CSDN博客后,有些同学发现,学了之后有啥用,有什么实际场景可以用到吗?程序员就是这样,不习惯于纸上谈兵,给一个场景show me code才是最实…...
【BBC新闻文章分类】使用 TF 2.0和 LSTM 的文本分类
一、说明 NLP上的许多创新是如何将上下文添加到词向量中。常见的方法之一是使用递归神经网络...
set和map的封装
目录 介绍 红黑树代码 set insert的迭代器转换问题 为什么会有这样的问题? 如何解决 代码 map 注意点 代码 介绍 set和map的底层都是红黑树,所以我们可以在自己实现的红黑树(简易版)的基础上,进行封装,成为简易的set和map 红黑树代码 #pragma once#include <…...
java基础练习--基础语法
预备知识:Java基本语法、分支、循环、数组和字符串 7-1 累加器 请你实现一个累加器。输入n个非负整数,输出他们的和。 1<n<1000,而每个数则<10000。 输入格式: 输入包括两行。 第一行:包括一个整数n,表示总共有n个数。 第二行:包…...
Android12 OTA编译差分包报错问题
前言 在Ubuntu 20.04.4 LTS系统中编译Android12 OTA差分包的时候提示如下报错log: Warning: releasetools script should be invoked as hermetic Python executable -- build and run ota_from_target_files directly. Traceback (most recent call last):File "./bu…...
现代c++手撸2309神经网络最简化版230901
用c++输入数据:vector<vector<float>> inputs = { {1, 1}, {1, 0} };数据targets={0,1}; 测试:vector<vector<float>> inputs22 = { {1, 0}, {1,1} }; 构建神经网络,例如:NeuralNetwork nn({ 2, 4, 1 }); 则网络有四层、输入层2个节点、输出层1个节…...
Qt之显示PDF文件
之前使用过mupdf库,能够成功显示pdf,但是我用着有BUG,不太理解它的代码,搞了好久都不行。后面又试了其他库,如pdfium、popler、下载了很多例程,都跑不起来!后面偶然得知xpdf库,看起来…...
[极客大挑战 2019]FinalSQL - 异或盲注
1、这题的关键是找注入点,如果选择用户名、密码作为输入点就麻烦了 2、注入点:按钮,点击就传id;当id1时,提示Click others 可以利用id的特性,构造异或匹配 payload: f"1^(ord(substr((select…...
GLM-OCR在ComfyUI工作流中的应用:构建可视化OCR处理节点
GLM-OCR在ComfyUI工作流中的应用:构建可视化OCR处理节点 如果你经常用ComfyUI做图片生成或者编辑,可能会遇到一个挺麻烦的事儿:怎么把图片里的文字快速提取出来,然后用到下一步工作流里?比如,你想把一张海…...
豆包AI播客音频下载终极指南:F12抓包+剪映剪辑全流程(附避坑技巧)
豆包AI播客音频高效获取与精修实战手册 播客内容创作者常面临优质音频素材获取难题——当听到一段由AI生成的精彩播客却找不到下载入口时,那种"看得见摸不着"的焦灼感尤为强烈。本文将系统性地解决这一痛点,从技术原理到实操细节,…...
VSCode远程开发必备:SSH端口转发一键配置指南(含常见问题排查)
VSCode远程开发实战:SSH端口转发高效配置与深度排错 当你在咖啡厅修改代码时,远程服务器上的数据库服务突然需要紧急调试;当团队协作时,同事的内网API接口需要临时开放给你测试——这些场景下,SSH端口转发就像一把瑞士…...
阿里云域名动态解析避坑指南:从AccessKey到API调用的完整流程
阿里云域名动态解析实战手册:从权限配置到高可用方案设计 对于拥有个人博客、家庭NAS或远程开发环境的技术爱好者而言,动态公网IP始终是个令人头疼的问题。每当ISP重新分配IP地址时,原本稳定的服务连接就会突然中断。本文将分享如何利用阿里云…...
OpenClaw怎么搭建?2026年3月OpenClaw(Clawdbot)在腾讯云一键部署超全攻略
OpenClaw怎么搭建?2026年3月OpenClaw(Clawdbot)在腾讯云一键部署超全攻略。本文面向零基础用户,完整说明在轻量服务器与本地Windows11、macOS、Linux系统中部署OpenClaw(Clawdbot)的流程,包含环…...
HCIA复习作业
一、 实验拓扑二、 实验需求1.学校内HTTP客户端可以正常通过域名www.baidu.com访问百度的服务器 2.学校网络内部基于192.168.1.0/24划分,PC1可以访问3.3.3.0/24网段,PC2不允许 3.学校内部使用静态路由,R1和R2之间浮动静态路由 4.运营商使用动…...
你好吗吗吗吗吗
我真好...
YOLOv11涨点改进| TPAMI 2026 |全网创新首发、注意力改进篇|引入ASSA自适应稀疏自注意力,顶刊万能涨点模块,含5种超强创新,适合目标检测,图像分割,图像分类,图像超分等任务高效涨点
一、本文介绍 🔥本文给大家介绍利用将 ASSA自适应稀疏自注意力模块改进 YOLOv11网络模型,可以显著提升模型的特征建模能力和复杂场景下的检测性能。ASSA通过自注意力机制在全局范围内建立不同空间位置之间的依赖关系,使网络能够充分利用全局上下文信息,从而增强特征表达能…...
Tracepoint性能优化揭秘:从DECLARE_EVENT_CLASS看Linux内核如何节省50%内存开销
Tracepoint性能优化揭秘:从DECLARE_EVENT_CLASS看Linux内核如何节省50%内存开销 在Linux内核的性能调优领域,Tracepoint机制作为静态跟踪的核心基础设施,其性能表现直接影响着系统监控和故障诊断的效率。本文将深入剖析DECLARE_EVENT_CLASS共…...
AI编程助手太烧钱?试试这个‘外挂’:心灵宝石MCP服务在Cursor中的安装与长期使用心得
深度解析Cursor IDE中的MCP服务:心灵宝石的高效部署与实战技巧 作为一名全栈开发者,我几乎每天都要与代码编辑器打交道。从早期的Sublime Text到VS Code,再到如今集成了AI能力的Cursor,工具链的进化让开发效率不断提升。但随之而来…...
