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…...
【Go语言实战】(25) 分布式算法 MapReduce
MapReduce 写在前面 身为大数据专业的学生,其实大学我也多多少少接触过mapreduce,但是当时觉得这玩意太老了,觉得这和php一样会被时代淘汰。只能说当时确实太年轻了,没有好好珍惜那时候的学习资源… 现在回过头来看mapreduce&a…...
【网络安全-信息收集】网络安全之信息收集和信息收集工具讲解(提供工具)
工具下载百度网盘链接(包含所有用到的工具): 百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固,支持教育网加速,支持手机端。注册使用百度网盘即可享受免费存储空间https://pan.…...
战火使命ssr排名,战火使命角色强度排行
在战火使命中,很多玩家都在关注SSR角色的强度排行,那么,下面就为大家分享一下小编整理的最新战火使命ssr排名,一起来看看吧。 关注【娱乐天梯】,获取内部福利号 一、SSR角色排名榜: 1. 克拉拉、艾蕾娜、杰西…...
CSS之linear-gradient( ) 函数—背景颜色渐变设计
目录 linear-gradient( ) 函数 简介: 语法: 详解: 例如: linear-gradient( ) 函数 简介: linear-gradient 函数是 CSS 中用于创建线性渐变的函数。它接受一个或多个参数,并使用这些参数创建一个渐变。…...
[Unity]未能加载一个或多个断点问题
【背景】 大家2023国庆快乐,虽然是假期,我还是继续码些文章。 今天写项目时遇到个环境问题,新建脚本时双击调起VS编辑器,忽然提示无法加载一个或多个断点(当时忘记截图了,现在已解决,就不上图了…...
Qt中的基础数据类型
1.基础类型 因为Qt是一个C++ 框架, 因此C++中所有的语法和数据类型在Qt中都是被支持的, 但是Qt中也定义了一些属于自己的数据类型, 下边给大家介绍一下这些基础的数类型 QT基本数据类型定义在#include <QtGlobal> 中,QT基本数据类型有: 类型名称注释备注qint8signed ch…...
2023阿里云域名优惠口令大全
2023年阿里云域名优惠口令,com域名续费优惠口令“com批量注册更享优惠”,cn域名续费优惠口令“cn注册多个价格更优”,cn域名注册优惠口令“互联网上的中国标识”,阿里云优惠口令是域名专属的优惠码,可用于域名注册、续…...
湖南软件测评公司简析:软件功能测试和非功能测试的联系和区别
一、软件功能测试 软件功能测试旨在验证软件是否按照需求规格说明书的要求正常工作。具体而言,功能测试会对软件的所有功能进行测试,以确保其满足用户的需求和预期。在进行功能测试时,根据需求规格说明书编写测试用例,并在测试…...
HuggingFace Transformers教程(1)--使用AutoClass加载预训练实例
知识的搬运工又来啦 ☆*: .。. o(≧▽≦)o .。.:*☆ 【传送门>原文链接:】https://huggingface.co/docs/transformers/autoclass_tutorial 🚗🚓🚕🛺🚙🛻🚌Ƕ…...
Qt获取当前所用的Qt版本、编译器、位数等信息
//详细的Qt版本编译器位数 QString compilerString "<unknown>"; { #if defined(Q_CC_CLANG)QString isAppleString; #if defined(__apple_build_version__)isAppleString QLatin1String(" (Apple)"); #endifcompilerString QLatin1String("…...
ufolio wordpress主题/青岛网站建设制作推广
目录 栈 顺序栈 定义 初始化 判断栈空 入栈 出栈 读栈顶元素 共享栈 定义 初始化栈 栈的链式存储 定义 初始化 入栈 出栈 取栈顶 队列 顺序存储结构 定义 循环队列 初始化 判断队空 入队 出队 链式队列的基本操作 定义 初始化 判队空 入队 出队 栈…...
餐饮加盟网站怎么做/长春seo优化企业网络跃升
在一般的程序应用中,如果出现异常信息的话,我们可能会使用 e.printStackTrace(); 将相关的异常信息打印出来,但是在实际的应用中,我们遇到了一个这样的问题,我不仅想要把异常信息打印出来 而且我想以邮件的形式把异常的…...
金华app网站开发/seo优化关键词放多少合适
Redis客户端: Java基于Jedis开发 C#基于StackExchange开发 C基于acl开发 首先确保在主从模式下,客户端能分辨主从节点,自动连接正确的客户端,这样只要有一个节点可用,操作就可正确执行(一般需要Redis Senti…...
电脑网站你懂我意思正能量/郑州seo顾问外包公司
单点登录SSO(Single Sign-On)是身份管理中的一部分。SSO的一种较为通俗的定义是:SSO是指访问同一服务器,不同应用中受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其…...
深圳市网站建设/seo关键词排名软件
1. 网络通讯协议 2. TCP 3. 小结...
政府类门户网站/百度一下百度下载
为什么80%的码农都做不了架构师?>>> 日期:2012-4-13 来源:GBin1.com 当我们拿到数据时,如果能够有效的将数据展示成大家一眼就看得懂的图形是不是更好呢?使用信息图来阐述想法和结论往往是个不错的主意。…...