当前位置: 首页 > news >正文

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多线程编程与并发处理

引言 在现代编程中&#xff0c;多线程和并发处理是提高程序运行效率和资源利用率的重要方法。Java提供了丰富的多线程编程支持&#xff0c;包括线程的创建与生命周期管理、线程同步与锁机制、并发库和高级并发工具等。本文将详细介绍这些内容&#xff0c;并通过表格进行总结和…...

C++ 35 之 对象模型基础

#include <iostream> #include <string.h> using namespace std;class Students05{ public:// 只有非静态成员变量才算存储空间&#xff0c;其他都不算int s_a; // 非静态成员变量&#xff0c;算对象的存储空间double s_c;// 成员函数 不算对象的存储空间void f…...

PHP超级全局变量:功能、应用及最佳实践

PHP中的超级全局变量&#xff08;Superglobal Variables&#xff09;是预定义的数组&#xff0c;它们在脚本的全部作用域内都可以访问&#xff0c;无需使用global关键字。超级全局变量包含了关于请求、会话、服务器等各种信息&#xff0c;常见的有$_GET、$_POST、$_REQUEST、$_…...

python在windows创建的文件,换成linux系统格式

python在windows创建的文件,换成linux系统格式 dos2unix.exe的下载&#xff08;下载的文件放入路径下:C:\Windows\System32&#xff09; 链接&#xff1a;https://pan.baidu.com/s/10fC2tfvUtbh-axJ21cj_Xw?pwdm3zc 提取码&#xff1a;m3zc 批量修改文件格式 import subpr…...

最新区块链论文速读--CCF A会议 ICSE 2024 共13篇 附pdf下载 (2/2)

Conference&#xff1a;International Conference on Software Engineering (ICSE) CCF level&#xff1a;CCF A Categories&#xff1a;Software Engineering/System Software/Programming Languages Year&#xff1a;2024 Num&#xff1a;13 第1~7篇区块链文章请点击此处…...

C++ 34 之 单例模式

#include <iostream> #include <string.h> using namespace std;class King{// 公共的函数&#xff0c;为了让外部可以获取唯一的实例 public:// getInstance 获取单例 约定俗成static King* getInstance(){return true_king;}private: // 私有化// 构造函数设置为…...

SAP BW:传输转换源系统-源系统映射关系

最近有朋友再问问我源系统映射关系怎么配置&#xff0c;想着写一个怕以后忘了。 简单说下这个是干嘛的&#xff0c;其实就是配置一个源系统到目标系统的一个映射&#xff0c;这样传输的时候才知道传过来的数据源要变成目标系统的数据源。 比如下图&#xff0c;在开发环境&…...

React+TS前台项目实战(九)-- 全局常用组件弹窗Dialog封装

文章目录 前言Dialog公共弹窗组件1. 功能分析2. 代码详细注释3. 使用方式4. 效果展示 总结 前言 今天这篇主要讲全局公共弹窗Dialog组件封装&#xff0c;将用到上篇封装的模态框Modal组件。有时在前台项目中&#xff0c;偶尔要用到一两个常用的组件&#xff0c;如 弹窗&#x…...

利用视觉分析技术提升水面漂浮物、水面垃圾检测效率

随着城市化进程的加速和工业化的发展&#xff0c;水体污染问题日益严重&#xff0c;水面漂浮物成为水环境治理的一大难题。传统的水面漂浮物检测方法主要依赖人工巡查和简单的传感器检测&#xff0c;存在着效率低、准确率不高等问题。为了提升水面漂浮物检测的效率和准确性&…...

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课程刚刚结课&#xff0c;但还是有其他课程在继续。 所以接下来我会抽时间&#xff0c;根据笔记以及网络资料&#xff0c;整理和Linux相关的知识文档&#xff0c;各位可以后续留意. 完整的章目录我会先发出来&#xff0c;后续补充完整。 所有的内容会在 下周三(6…...

诊所管理系统哪家会好一点

随着医疗行业的快速发展和信息化进程的加速&#xff0c;诊所作为医疗服务的重要基层单位&#xff0c;其运营管理效率与服务质量的提升愈发依赖于现代化的管理工具。诊所管理系统应运而生&#xff0c;旨在通过集成化、智能化的技术手段&#xff0c;帮助诊所实现诊疗流程优化、资…...

前端根据权限生成三级路由

三级菜单和后端返回数组对比获取有权限的路由 数组&#xff1a; //后端返回的数组 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&#xff0c;Databricks将增强 Delta Lake 和 Iceberg 社区合作&#xff0c;以实现 Lakehouse 底层格式的开放与兼容([1] [2])。 2. Zilliz 推出 Milvus Lite 轻量级向量数据库&#xff0c;支持本地运行&#xff1b;Milvus Lite 复…...

算法day29

第一题 695. 岛屿的最大面积 本题解法&#xff1a;采用bfs的算法&#xff1b; 本题使用象限数组的遍历方法和定义布尔数组vis来遍历每一个元素的上下左右元素&#xff0c;防治被遍历的元素被二次遍历&#xff1b; 本题具体分析如上题故事&#xff0c;但是由于要求区域的最大面…...

车牌识别(附源代码)

完整项目已上传至github:End-to-end-for-chinese-plate-recognition/License-plate-recognition at master duanshengliu/End-to-end-for-chinese-plate-recognition GitHub 整体思路&#xff1a; 1.利用u-net图像分割得到二值化图像 2.再使用cv2进行边缘检测获得车牌区域坐…...

在VSCode中安装python

引言 Python 是一种广泛使用的高级编程语言&#xff0c;因其易学、易用、强大而受到欢迎。它由 Guido van Rossum 于 1991 年首次发布&#xff0c;并以简洁的语法和丰富的库生态系统而著称。 以下是 Python 的一些关键特点和优势&#xff1a; 关键特点 易于学习和使用&#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&#xff0c;创建一个表示客户端的变量。request, err : http.NewRequest("GET", "https://ifconfig.io/ip&quo…...

KafkaQ - 好用的 Kafka Linux 命令行可视化工具

软件效果前瞻 ~ 鉴于并没有在网上找到比较好的linux平台的kafka可视化工具&#xff0c;今天为大家介绍一下自己开发的在 Linux 平台上使用的可视化工具KafkaQ 虽然简陋&#xff0c;主要可以实现下面的这些功能&#xff1a; 1&#xff09;查看当前topic的分片数量和副本数量 …...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

Java数组Arrays操作全攻略

Arrays类的概述 Java中的Arrays类位于java.util包中&#xff0c;提供了一系列静态方法用于操作数组&#xff08;如排序、搜索、填充、比较等&#xff09;。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序&#xff08;sort&#xff09; 对数组进行升序…...

命令行关闭Windows防火墙

命令行关闭Windows防火墙 引言一、防火墙:被低估的"智能安检员"二、优先尝试!90%问题无需关闭防火墙方案1:程序白名单(解决软件误拦截)方案2:开放特定端口(解决网游/开发端口不通)三、命令行极速关闭方案方法一:PowerShell(推荐Win10/11)​方法二:CMD命令…...

Mac flutter环境搭建

一、下载flutter sdk 制作 Android 应用 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 1、查看mac电脑处理器选择sdk 2、解压 unzip ~/Downloads/flutter_macos_arm64_3.32.2-stable.zip \ -d ~/development/ 3、添加环境变量 命令行打开配置环境变量文件 ope…...