Java多线程编程与并发处理
引言
在现代编程中,多线程和并发处理是提高程序运行效率和资源利用率的重要方法。Java提供了丰富的多线程编程支持,包括线程的创建与生命周期管理、线程同步与锁机制、并发库和高级并发工具等。本文将详细介绍这些内容,并通过表格进行总结和示范。
线程的创建与生命周期
使用Thread类
可以通过继承Thread类来创建线程,并重写其run方法。
public class MyThread extends Thread {public void run() {System.out.println("Thread is running.");}public static void main(String[] args) {MyThread thread = new MyThread();thread.start();}
}
使用Runnable接口
实现Runnable接口并将其实例传递给Thread对象也是创建线程的一种方式。
public class MyRunnable implements Runnable {public void run() {System.out.println("Runnable is running.");}public static void main(String[] args) {MyRunnable runnable = new MyRunnable();Thread thread = new Thread(runnable);thread.start();}
}
使用线程池
使用ExecutorService可以创建和管理线程池。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class ThreadPoolExample {public static void main(String[] args) {ExecutorService executor = Executors.newFixedThreadPool(5);for (int i = 0; i < 10; i++) {Runnable worker = new MyRunnable();executor.execute(worker);}executor.shutdown();}
}
线程的生命周期
线程有以下几种状态:
- 新建(New)
- 就绪(Runnable)
- 运行(Running)
- 等待/阻塞/休眠(Waiting/Blocked/Sleeping)
- 终止(Terminated)
线程同步与锁机制
同步方法
使用sychronized关键字可以同步方法,确保同一时刻只有一个线程可以访问该方法。
public class SynchronizedExample {private int count = 0;public synchronized void increment() {count++;}public static void main(String[] args) {SynchronizedExample example = new SynchronizedExample();example.increment();}
}
同步块
同步块使用sychronized关键字包围代码块,比同步方法更加灵活。
public class SynchronizedBlockExample {private int count = 0;private final Object lock = new Object();public void increment() {synchronized (lock) {count++;}}public static void main(String[] args) {SynchronizedBlockExample example = new SynchronizedBlockExample();example.increment();}
}
ReentrantLock
ReentrantLock提供了更加灵活的锁机制。
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class ReentrantLockExample {private int count = 0;private final Lock lock = new ReentrantLock();public void increment() {lock.lock();try {count++;} finally {lock.unlock();}}public static void main(String[] args) {ReentrantLockExample example = new ReentrantLockExample();example.increment();}
}
并发库
Executor框架
Executor框架是Java并发库的核心部分,简化了并发任务的执行。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class ExecutorExample {public static void main(String[] args) {ExecutorService executor = Executors.newFixedThreadPool(2);for (int i = 0; i < 5; i++) {executor.submit(() -> {System.out.println(Thread.currentThread().getName() + " is executing task.");});}executor.shutdown();}
}
Future和Callable
Callable接口表示一个可以返回结果的任务,Future接口表示异步计算的结果。
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;public class FutureCallableExample {public static void main(String[] args) {ExecutorService executor = Executors.newCachedThreadPool();Callable<Integer> task = () -> {Thread.sleep(2000);return 123;};Future<Integer> future = executor.submit(task);try {System.out.println("Result: " + future.get());} catch (InterruptedException | ExecutionException e) {e.printStackTrace();} finally {executor.shutdown();}}
}
高级并发工具
CountDownLatch
CountDownLatch允许一个或多个线程等待,直到其他线程完成一组操作。
import java.util.concurrent.CountDownLatch;public class CountDownLatchExample {public static void main(String[] args) throws InterruptedException {int count = 3;CountDownLatch latch = new CountDownLatch(count);for (int i = 0; i < count; i++) {new Thread(() -> {System.out.println(Thread.currentThread().getName() + " is running.");latch.countDown();}).start();}latch.await();System.out.println("All tasks completed.");}
}
CyclicBarrier
CyclicBarrier允许一组线程互相等待,直到所有线程都到达一个屏障点,然后继续执行。
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;public class CyclicBarrierExample {public static void main(String[] args) {int count = 3;CyclicBarrier barrier = new CyclicBarrier(count, () -> {System.out.println("All threads arrived. Let's continue...");});for (int i = 0; i < count; i++) {new Thread(() -> {System.out.println(Thread.currentThread().getName() + " is waiting.");try {barrier.await();} catch (InterruptedException | BrokenBarrierException e) {e.printStackTrace();}}).start();}}
}
表格总结
线程的创建方法
| 创建方法 | 描述 | 示例 |
|---|---|---|
| 继承Thread类 | 创建一个新的线程类,重写run方法 | class MyThread extends Thread { public void run() { ... } } |
| 实现Runnable接口 | 创建一个实现Runnable接口的类,实现run方法 | class MyRunnable implements Runnable { public void run() { ... } } |
| 使用ExecutorService | 创建和管理线程池 | ExecutorService executor = Executors.newFixedThreadPool(5); |
线程同步方法
| 同步方法 | 描述 | 示例 |
|---|---|---|
| synchronized方法 | 同步整个方法,只允许一个线程访问 | public synchronized void increment() { ... } |
| synchronized块 | 同步代码块,只允许一个线程访问指定代码块 | synchronized (lock) { ... } |
| ReentrantLock | 显式锁机制,提供了更灵活的同步控制 | lock.lock(); try { ... } finally { lock.unlock(); } |
并发工具
| 工具 | 描述 | 示例 |
|---|---|---|
| CountDownLatch | 允许一个或多个线程等待,直到其他线程完成一组操作 | new CountDownLatch(count); |
| CyclicBarrier | 允许一组线程互相等待,直到所有线程都到达屏障点 | new CyclicBarrier(count, Runnable); |
| Executor框架 | 简化并发任务的执行和管理 | ExecutorService executor = Executors.newFixedThreadPool(2); |
| Future和Callable | 表示异步计算和可返回结果的任务 | Future<Integer> future = executor.submit(task); |
应用场景与实践:生产者-消费者模型
生产者-消费者模型是多线程编程中的经典问题。该模型中,通过使用BlockingQueue可以方便地实现线程之间的安全通信和协调,从而避免资源争用和死锁问题。
示例:生产者-消费者模型
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;public class ProducerConsumerExample {public static void main(String[] args) {BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(10);// 生产者Runnable producer = () -> {int value = 0;while (true) {try {queue.put(value);System.out.println("Produced: " + value);value++;Thread.sleep(500); // 模拟生产时间} catch (InterruptedException e) {Thread.currentThread().interrupt();}}};// 消费者Runnable consumer = () -> {while (true) {try {int value = queue.take();System.out.println("Consumed: " + value);Thread.sleep(1000); // 模拟消费时间} catch (InterruptedException e) {Thread.currentThread().interrupt();}}};new Thread(producer).start();new Thread(consumer).start();}
}
在以上示例中,BlockingQueue用作存储数据的共享缓冲区,生产者线程不断向队列中添加数据,而消费者线程从队列中取出数据进行处理。通过BlockingQueue的阻塞特性,生产者和消费者在队列满或空时自动等待,从而实现线程间的协调。
表格总结
线程的创建方法
| 创建方法 | 描述 | 示例 |
|---|---|---|
| 继承Thread类 | 创建一个新的线程类,重写run方法 | class MyThread extends Thread { public void run() { ... } } |
| 实现Runnable接口 | 创建一个实现Runnable接口的类,实现run方法 | class MyRunnable implements Runnable { public void run() { ... } } |
| 使用ExecutorService | 创建和管理线程池 | ExecutorService executor = Executors.newFixedThreadPool(5); |
线程同步方法
| 同步方法 | 描述 | 示例 |
|---|---|---|
| synchronized方法 | 同步整个方法,只允许一个线程访问 | public synchronized void increment() { ... } |
| synchronized块 | 同步代码块,只允许一个线程访问指定代码块 | synchronized (lock) { ... } |
| ReentrantLock | 显式锁机制,提供了更灵活的同步控制 | lock.lock(); try { ... } finally { lock.unlock(); } |
并发工具
| 工具 | 描述 | 示例 |
|---|---|---|
| CountDownLatch | 允许一个或多个线程等待,直到其他线程完成一组操作 | new CountDownLatch(count); |
| CyclicBarrier | 允许一组线程互相等待,直到所有线程都到达屏障点 | new CyclicBarrier(count, Runnable); |
| Executor框架 | 简化并发任务的执行和管理 | ExecutorService executor = Executors.newFixedThreadPool(2); |
| Future和Callable | 表示异步计算和可返回结果的任务 | Future<Integer> future = executor.submit(task); |
线程池与并发框架
Java并发编程中,线程池与并发框架是实现高效多线程的关键组件。线程池可以重复利用线程,减少线程创建和销毁的开销。而并发框架如java.util.concurrent包则提供了丰富的并发工具。
线程池示例:固定大小线程池
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class FixedThreadPoolExample {public static void main(String[] args) {ExecutorService executor = Executors.newFixedThreadPool(3);for (int i = 0; i < 5; i++) {executor.submit(() -> {System.out.println(Thread.currentThread().getName() + " is executing task.");try {Thread.sleep(1000); // 模拟任务执行时间} catch (InterruptedException e) {Thread.currentThread().interrupt();}});}executor.shutdown();}
}
在此示例中,使用Executors.newFixedThreadPool(int)方法创建一个固定大小的线程池,并提交多个任务供线程池执行。线程池能有效管理线程的创建和销毁,优化资源使用。
锁和同步机制
在多线程环境下,正确的锁和同步机制是防止数据竞争和确保数据一致性的关键。
ReentrantLock示例
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class ReentrantLockExample {private int count = 0;private final Lock lock = new ReentrantLock();public void increment() {lock.lock();try {count++;System.out.println(Thread.currentThread().getName() + " count: " + count);} finally {lock.unlock();}}public static void main(String[] args) {ReentrantLockExample example = new ReentrantLockExample();Runnable task = example::increment;for (int i = 0; i < 5; i++) {new Thread(task).start();}}
}
在上述示例中,ReentrantLock用于显式锁机制,确保同一时刻只有一个线程能够访问共享数据。
结束语
本文详细介绍了Java中的多线程编程和并发处理,包括线程的创建与生命周期、线程同步与锁机制、并发库和高级并发工具等。通过代码示例和表格总结,希望您能更好地理解和应用Java的多线程编程,提高程序性能和资源利用率。

相关文章:
Java多线程编程与并发处理
引言 在现代编程中,多线程和并发处理是提高程序运行效率和资源利用率的重要方法。Java提供了丰富的多线程编程支持,包括线程的创建与生命周期管理、线程同步与锁机制、并发库和高级并发工具等。本文将详细介绍这些内容,并通过表格进行总结和…...
C++ 35 之 对象模型基础
#include <iostream> #include <string.h> using namespace std;class Students05{ public:// 只有非静态成员变量才算存储空间,其他都不算int s_a; // 非静态成员变量,算对象的存储空间double s_c;// 成员函数 不算对象的存储空间void f…...
PHP超级全局变量:功能、应用及最佳实践
PHP中的超级全局变量(Superglobal Variables)是预定义的数组,它们在脚本的全部作用域内都可以访问,无需使用global关键字。超级全局变量包含了关于请求、会话、服务器等各种信息,常见的有$_GET、$_POST、$_REQUEST、$_…...
python在windows创建的文件,换成linux系统格式
python在windows创建的文件,换成linux系统格式 dos2unix.exe的下载(下载的文件放入路径下:C:\Windows\System32) 链接:https://pan.baidu.com/s/10fC2tfvUtbh-axJ21cj_Xw?pwdm3zc 提取码:m3zc 批量修改文件格式 import subpr…...
最新区块链论文速读--CCF A会议 ICSE 2024 共13篇 附pdf下载 (2/2)
Conference:International Conference on Software Engineering (ICSE) CCF level:CCF A Categories:Software Engineering/System Software/Programming Languages Year:2024 Num:13 第1~7篇区块链文章请点击此处…...
C++ 34 之 单例模式
#include <iostream> #include <string.h> using namespace std;class King{// 公共的函数,为了让外部可以获取唯一的实例 public:// getInstance 获取单例 约定俗成static King* getInstance(){return true_king;}private: // 私有化// 构造函数设置为…...
SAP BW:传输转换源系统-源系统映射关系
最近有朋友再问问我源系统映射关系怎么配置,想着写一个怕以后忘了。 简单说下这个是干嘛的,其实就是配置一个源系统到目标系统的一个映射,这样传输的时候才知道传过来的数据源要变成目标系统的数据源。 比如下图,在开发环境&…...
React+TS前台项目实战(九)-- 全局常用组件弹窗Dialog封装
文章目录 前言Dialog公共弹窗组件1. 功能分析2. 代码详细注释3. 使用方式4. 效果展示 总结 前言 今天这篇主要讲全局公共弹窗Dialog组件封装,将用到上篇封装的模态框Modal组件。有时在前台项目中,偶尔要用到一两个常用的组件,如 弹窗&#x…...
利用视觉分析技术提升水面漂浮物、水面垃圾检测效率
随着城市化进程的加速和工业化的发展,水体污染问题日益严重,水面漂浮物成为水环境治理的一大难题。传统的水面漂浮物检测方法主要依赖人工巡查和简单的传感器检测,存在着效率低、准确率不高等问题。为了提升水面漂浮物检测的效率和准确性&…...
NFT 智能合约实战-快速开始(1)NFT发展历史 | NFT合约标准(ERC-721、ERC-1155和ERC-998)介绍
文章目录 NFT 智能合约实战-快速开始(1)NFT发展历史国内NFT市场国内NFT合规性如何获得NFT?如何查询NFT信息?在 OpenSea 上查看我们的 NFT什么是ERC721NFT合约标准ERC-721、ERC-1155和ERC-998 对比ERC721IERC721.sol 接口内容关于合约需要接收 ERC721 资产 onERC721Received…...
Linux知识整理说明
最近学校Linux课程刚刚结课,但还是有其他课程在继续。 所以接下来我会抽时间,根据笔记以及网络资料,整理和Linux相关的知识文档,各位可以后续留意. 完整的章目录我会先发出来,后续补充完整。 所有的内容会在 下周三(6…...
诊所管理系统哪家会好一点
随着医疗行业的快速发展和信息化进程的加速,诊所作为医疗服务的重要基层单位,其运营管理效率与服务质量的提升愈发依赖于现代化的管理工具。诊所管理系统应运而生,旨在通过集成化、智能化的技术手段,帮助诊所实现诊疗流程优化、资…...
前端根据权限生成三级路由
三级菜单和后端返回数组对比获取有权限的路由 数组: //后端返回的数组 const arr1 [sale.management, sale.order, sale.detail]; //前端路由 const arr2 [{path: "/sale-manage",redirect: "/sale-manage/sale-order/sale-list",name: sale…...
Databricks超10亿美元收购Tabular;Zilliz 推出 Milvus Lite ; 腾讯云支持Redis 7.0
重要更新 1. Databricks超10亿美元收购Tabular,Databricks将增强 Delta Lake 和 Iceberg 社区合作,以实现 Lakehouse 底层格式的开放与兼容([1] [2])。 2. Zilliz 推出 Milvus Lite 轻量级向量数据库,支持本地运行;Milvus Lite 复…...
算法day29
第一题 695. 岛屿的最大面积 本题解法:采用bfs的算法; 本题使用象限数组的遍历方法和定义布尔数组vis来遍历每一个元素的上下左右元素,防治被遍历的元素被二次遍历; 本题具体分析如上题故事,但是由于要求区域的最大面…...
车牌识别(附源代码)
完整项目已上传至github:End-to-end-for-chinese-plate-recognition/License-plate-recognition at master duanshengliu/End-to-end-for-chinese-plate-recognition GitHub 整体思路: 1.利用u-net图像分割得到二值化图像 2.再使用cv2进行边缘检测获得车牌区域坐…...
在VSCode中安装python
引言 Python 是一种广泛使用的高级编程语言,因其易学、易用、强大而受到欢迎。它由 Guido van Rossum 于 1991 年首次发布,并以简洁的语法和丰富的库生态系统而著称。 以下是 Python 的一些关键特点和优势: 关键特点 易于学习和使用&#x…...
StarkNet架构之L1-L2消息传递机制
文章目录 StarkNet架构之L1-L2消息传递机制L2 → L1消息L2 → L1消息结构L2 → L1消息哈希L1 → L2消息L1 → L2消息取消L1 → L2报文费用L1 → L2哈希额外资源StarkNet架构之L1-L2消息传递机制 原文地址:https://docs.starknet.io/architecture-and-concepts/network-archit…...
19.2 HTTP客户端-定制HTTP请求、调试HTTP、响应超时
1. 定制HTTP请求 如果需要对向服务器发送的HTTP请求做更多超越于默认设置的定制化。 client : http.Client{} 使用net/http包提供的导出类型Client,创建一个表示客户端的变量。request, err : http.NewRequest("GET", "https://ifconfig.io/ip&quo…...
KafkaQ - 好用的 Kafka Linux 命令行可视化工具
软件效果前瞻 ~ 鉴于并没有在网上找到比较好的linux平台的kafka可视化工具,今天为大家介绍一下自己开发的在 Linux 平台上使用的可视化工具KafkaQ 虽然简陋,主要可以实现下面的这些功能: 1)查看当前topic的分片数量和副本数量 …...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...
