Java中实现和管理线程池有哪些方式?

2024-09-01 11:28

本文主要是介绍Java中实现和管理线程池有哪些方式?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在 Java 中,实现和管理线程池有多种方式。以下是几种常见的方式,包括使用 Executors 工具类、直接使用 ThreadPoolExecutor、自定义线程池等。

1. 使用 Executors 工具类

Executors 工具类提供了几种便捷的方法来创建常见类型的线程池:

1.1 固定大小线程池 (Fixed Thread Pool)

适用于需要固定数量线程处理任务的场景。

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(4);// 提交任务到线程池
fixedThreadPool.submit(() -> {// 任务逻辑
});// 关闭线程池
fixedThreadPool.shutdown();
1.2 缓存线程池 (Cached Thread Pool)

适用于大量短生命周期任务的场景,线程池大小根据需要自动调整。

ExecutorService cachedThreadPool = Executors.newCachedThreadPool();// 提交任务到线程池
cachedThreadPool.submit(() -> {// 任务逻辑
});// 关闭线程池
cachedThreadPool.shutdown();
1.3 单线程池 (Single Thread Executor)

确保任务按顺序执行,只有一个线程。

ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();// 提交任务到线程池
singleThreadExecutor.submit(() -> {// 任务逻辑
});// 关闭线程池
singleThreadExecutor.shutdown();
1.4 调度线程池 (Scheduled Thread Pool)

用于周期性或定时执行任务。

ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(2);// 提交延时任务
scheduledThreadPool.schedule(() -> {// 任务逻辑
}, 5, TimeUnit.SECONDS);// 提交周期性任务
scheduledThreadPool.scheduleAtFixedRate(() -> {// 任务逻辑
}, 0, 10, TimeUnit.SECONDS);// 关闭线程池
scheduledThreadPool.shutdown();

2. 直接使用 ThreadPoolExecutor

ThreadPoolExecutor 提供了更高级的线程池配置选项,适用于需要高度定制的场景。

2.1 使用 ThreadPoolExecutor 创建线程池
int corePoolSize = 2;
int maximumPoolSize = 4;
long keepAliveTime = 10;
TimeUnit unit = TimeUnit.SECONDS;
BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(2);RejectedExecutionHandler handler = new ThreadPoolExecutor.CallerRunsPolicy();ExecutorService threadPool = new ThreadPoolExecutor(corePoolSize,maximumPoolSize,keepAliveTime,unit,workQueue,Executors.defaultThreadFactory(),handler);// 提交任务到线程池
threadPool.submit(() -> {// 任务逻辑
});// 关闭线程池
threadPool.shutdown();

3. 自定义线程池

您可以通过实现 ThreadFactory 接口或自定义 RejectedExecutionHandler 来创建更复杂的线程池行为。

3.1 自定义 ThreadFactory

用于定制新创建线程的属性,比如名称、优先级等。

ThreadFactory customThreadFactory = new ThreadFactory() {private final AtomicInteger threadNumber = new AtomicInteger(1);@Overridepublic Thread newThread(Runnable r) {Thread thread = new Thread(r);thread.setName("CustomThread-" + threadNumber.getAndIncrement());thread.setPriority(Thread.NORM_PRIORITY);return thread;}
};ExecutorService customThreadPool = new ThreadPoolExecutor(2, 4, 60L, TimeUnit.SECONDS, new SynchronousQueue<>(), customThreadFactory);customThreadPool.submit(() -> {// 任务逻辑
});customThreadPool.shutdown();
3.2 自定义 RejectedExecutionHandler

用于定制任务被拒绝时的处理逻辑。

RejectedExecutionHandler customHandler = new RejectedExecutionHandler() {@Overridepublic void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {System.out.println("Task rejected: " + r.toString());// 自定义处理逻辑}
};ExecutorService customThreadPoolWithHandler = new ThreadPoolExecutor(2, 4, 60L, TimeUnit.SECONDS, new ArrayBlockingQueue<>(2), customHandler);customThreadPoolWithHandler.submit(() -> {// 任务逻辑
});customThreadPoolWithHandler.shutdown();

4. ForkJoinPool

ForkJoinPool 是专为任务分解和合并设计的高级线程池,适用于并行计算任务。

ForkJoinPool forkJoinPool = new ForkJoinPool();ForkJoinTask<?> task = forkJoinPool.submit(() -> {// 分解和合并任务
});task.join(); // 等待任务完成forkJoinPool.shutdown();

5. CompletableFuture

CompletableFuture 提供了异步任务的更高层次抽象,并支持链式处理和组合。

CompletableFuture.supplyAsync(() -> {// 异步任务return "Result";
}).thenApply(result -> {// 下一步处理return result.toUpperCase();
}).thenAccept(System.out::println);

小结

  • Executors 工具类:提供便捷的固定大小线程池、缓存线程池、单线程池和调度线程池的创建方法,适用于大多数常见应用场景。
  • ThreadPoolExecutor:提供高度灵活的线程池配置选项,适用于需要精细控制线程池行为的场景。
  • 自定义线程池:通过实现 ThreadFactoryRejectedExecutionHandler 接口,可以创建具有特定行为和属性的线程池。
  • ForkJoinPool:适用于需要将任务分解为更小子任务并行执行的场景。
  • CompletableFuture:提供流式 API 和组合功能用于异步任务处理,非常适合复杂的异步编程。

选择适合的线程池实现和管理方式可以有效提升多线程应用的性能和可维护性。

这篇关于Java中实现和管理线程池有哪些方式?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

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

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖