Java多线程系列——JDK并发包

2024-02-25 18:44
文章标签 java jdk 多线程 系列 发包

本文主要是介绍Java多线程系列——JDK并发包,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Java并发编程是Java开发中不可或缺的一部分,它允许开发者编写能够同时执行多个任务的应用程序,提高了程序的执行效率和响应速度。自从Java 5开始,java.util.concurrent包成为了并发编程的核心,引入了多种并发工具类,使得并发程序的编写变得更加简单和高效。本文将深入探讨这个包中的各种并发工具及其用途。

 

Executor框架

Executor框架是java.util.concurrent包的基石,提供了管理线程池的机制,允许开发者分离任务的提交与任务的执行过程。

  • Executor接口:定义了一个执行提交任务的简单接口,主要方法为execute(Runnable command)
  • ExecutorService接口:是更完善的Executor,提供了生命周期管理的方法,比如shutdown()submit(),后者可以提交Callable任务并返回Future
  • ScheduledExecutorService接口:扩展了ExecutorService,支持定时及周期性任务执行。
  • ThreadPoolExecutor和ScheduledThreadPoolExecutor类:这两个类是上述接口的具体实现,提供了灵活的线程池管理策略。

示例 

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class ExecutorExample {public static void main(String[] args) {// 创建一个固定大小的线程池ExecutorService executor = Executors.newFixedThreadPool(2);// 提交任务给线程池执行executor.submit(() -> {System.out.println("Task 1 executed by " + Thread.currentThread().getName());});executor.submit(() -> {System.out.println("Task 2 executed by " + Thread.currentThread().getName());});// 关闭线程池executor.shutdown();}
}

 

同步器

java.util.concurrent包提供了多种同步器,帮助开发者控制并发访问和修改共享资源。

  • Semaphore(信号量):用于控制同时访问某个特定资源的操作数量,通过协调各个线程以保证合理的使用公共资源。
  • CountDownLatch:允许一个或多个线程等待其他线程完成操作。
  • CyclicBarrier:允许一组线程相互等待,直到所有线程都到达某个公共屏障点。
  • Phaser:提供了更灵活的回合制同步,是CyclicBarrier的通用版本,支持动态地增减参与者。
  • Exchanger:允许两个线程在汇合点交换数据,用于线程间的数据交换。

示例(使用CountDownLatch): 

import java.util.concurrent.CountDownLatch;public class CountDownLatchExample {public static void main(String[] args) throws InterruptedException {CountDownLatch latch = new CountDownLatch(2);new Thread(() -> {System.out.println("Task 1 started.");// 模拟任务执行try {Thread.sleep(1000);} catch (InterruptedException e) {Thread.currentThread().interrupt();}System.out.println("Task 1 finished.");latch.countDown();}).start();new Thread(() -> {System.out.println("Task 2 started.");// 模拟任务执行try {Thread.sleep(1000);} catch (InterruptedException e) {Thread.currentThread().interrupt();}System.out.println("Task 2 finished.");latch.countDown();}).start();// 等待两个任务都执行完毕latch.await();System.out.println("All tasks finished.");}
}

 

java.util.concurrent.locks包中,提供了比synchronized关键字更高级的锁机制。

  • Lock接口:比synchronized更灵活的锁机制,允许尝试非阻塞地获取锁、获取可中断锁以及尝试获取锁直到超时。
  • ReentrantLock:一个实现了Lock接口的可重入互斥锁。
  • ReadWriteLock接口:读写锁,允许多个线程同时读共享资源,但只有一个线程可以写。
  • ReentrantReadWriteLock:实现了ReadWriteLock,提供了读写分离的锁管理机制。

示例(使用ReentrantLock ):

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class ReentrantLockExample {private final Lock lock = new ReentrantLock();public void task() {lock.lock();try {System.out.println("Task executed by " + Thread.currentThread().getName());// 模拟任务执行} finally {lock.unlock();}}public static void main(String[] args) {ReentrantLockExample example = new ReentrantLockExample();Thread t1 = new Thread(example::task);Thread t2 = new Thread(example::task);t1.start();t2.start();}
}

 

并发集合

java.util.concurrent包提供了多种线程安全的集合类。

  • ConcurrentHashMap:一个高效的线程安全的HashMap实现。
  • CopyOnWriteArrayListCopyOnWriteArraySet:写时复制技术的应用,适合读多写少的并发场景。
  • BlockingQueue接口:支持两个附加操作的Queue,即在队列为空时获取元素的线程会等待队列变为非空,队列满时插入元素的线程会等待队列可用。

 示例(使用ConcurrentHashMap):

import java.util.concurrent.ConcurrentHashMap;public class ConcurrentHashMapExample {public static void main(String[] args) {ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>();map.put("key", "value");System.out.println(map.get("key"));}
}

 

原子变量

java.util.concurrent.atomic包中,提供了一组原子类用于在单个变量上进行无锁的线程安全操作。

  • AtomicIntegerAtomicLongAtomicBoolean等:提供了基本类型的原子操作。
  • AtomicReference:提供了对象引用的原子操作。
  • AtomicIntegerArrayAtomicLongArrayAtomicReferenceArray:提供了数组元素的原子操作。

示例(使用AtomicInteger):

import java.util.concurrent.atomic.AtomicInteger;public class AtomicIntegerExample {private static AtomicInteger counter = new AtomicInteger(0);public static void main(String[] args) {// 线程1增加计数器new Thread(() -> counter.incrementAndGet()).start();// 线程2增加计数器new Thread(() -> counter.incrementAndGet()).start();System.out.println("Counter: " + counter.get());}
}

 

CompletableFuture

CompletableFuture是在Java 8中引入的,提供了一个异步编程的框架。通过CompletableFuture,可以将回调式的编程风格与Future的优势结合起来,实现更加灵活的异步编程。

示例

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;public class CompletableFutureExample {public static void main(String[] args) throws ExecutionException, InterruptedException {CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {return "Hello from CompletableFuture";});// 等待异步操作完成并获取结果String result = future.get();System.out.println(result);}
}

 

总结

Java的并发包java.util.concurrent提供了一套强大的工具集,用于简化多线程程序的开发。无论是执行大量异步任务的线程池管理,还是精细的线程同步控制,或是高效的并发数据结构,Java并发包都能提供相应的解决方案。通过合理利用这些工具,可以大幅提升Java应用程序的性能、可靠性和可维护性。了解并掌握这些并发工具,对于每一个Java开发者来说都是非常重要的。

 

这篇关于Java多线程系列——JDK并发包的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/746368

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

常用的jdk下载地址

jdk下载地址 安装方式可以看之前的博客: mac安装jdk oracle 版本:https://www.oracle.com/java/technologies/downloads/ Eclipse Temurin版本:https://adoptium.net/zh-CN/temurin/releases/ 阿里版本: github:https://github.com/