四种最常见的线程池代码示例

2024-08-30 05:38

本文主要是介绍四种最常见的线程池代码示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;/*** 线程池* newCachedTheadPool 可缓存线程池,如果线程池长度超过处理需要,可以灵活回收空闲线程,若无可回收,则新建线程* newFixedThreadPool 定长线程池,可以控制线程最大并发数,超出的线程会在队列中等待* newScheduledThreadedPool 定长线程池,支持定时及周期性任务* newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序执行(FIFO,LIFO)*/
public class PoolTest1 {public static void main(String[] args) throws InterruptedException {// 可缓存线程池
//        createCacheThread();// 定长线程池
//        createFixedThread();//  周期线程池
//        createScheduleThread();// 单线程线程池createSingleThread();}/*** 可缓存线程池* 如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。** @throws InterruptedException*/public static void createCacheThread() throws InterruptedException {ExecutorService executorService = Executors.newCachedThreadPool();for (int i = 0; i < 10; i++) {final int temp = i;executorService.execute(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + ", temp: " + temp);}});// 如果加上sleep,可以更清晰地看到线程池将线程复用了
//            Thread.sleep(1);}}/*** 定长线程池* 可以控制线程的长度,控制线程的最大并发数,超出的线程会在队列中等待*/public static void createFixedThread() {// 可固定长度线程池ExecutorService executorService = Executors.newFixedThreadPool(3);for (int i = 0; i < 20; i++) {final int temp = i;executorService.execute(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + ", " + temp);}});}}/*** 周期线程池* 可以调用schedule方法,来执行延迟线程* 可以调用scheduleAtFixedRate方法来实现周期性执行线程** @throws InterruptedException*/private static void createScheduleThread() throws InterruptedException {ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(3);for (int i = 0; i < 20; i++) {Thread.sleep(50);final int temp = i;// 延迟3秒后执行scheduledExecutorService.schedule(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + ", " + temp);}// 3秒后执行}, 3, TimeUnit.SECONDS);// 每2秒执行一次scheduledExecutorService.scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + ", " + temp);}// 3秒后执行}, 2,3, TimeUnit.SECONDS);}}/*** 创建单个工作线程的线程池* 1、shutdown() 和 shutdownNow() 的区别* shutdown() 只是关闭了提交通道,用submit()是无效的;而内部该怎么跑还是怎么跑,跑完再停。* shutdownNow() 能立即停止线程池,正在跑的和正在等待的任务都停下了。** 2、shutdown() 和 awaitTermination() 的区别* shutdown() 后,不能再提交新的任务进去;但是 awaitTermination() 后,可以继续提交。** awaitTermination()是阻塞的,返回结果是线程池是否已停止(true/false);shutdown() 不阻塞。*/private static void createSingleThread() {ExecutorService executorService = Executors.newSingleThreadExecutor();for (int i = 0; i < 10; i++) {final int temp = i;// 可执行线程execute方法表示启动线程executorService.execute(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + ", " + temp);}});}executorService.shutdown();}
}

上面的方法通过修改main中的注释可以直接运行,代码已亲测没有问题。

这篇关于四种最常见的线程池代码示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

利用c++判断水仙花数并输出示例代码

《利用c++判断水仙花数并输出示例代码》水仙花数是指一个三位数,其各位数字的立方和恰好等于该数本身,:本文主要介绍利用c++判断水仙花数并输出的相关资料,文中通过代码介绍的非常详细,需要的朋友可以... 以下是使用C++实现的相同逻辑代码:#include <IOStream>#include <vec

SQL Server 中的表进行行转列场景示例

《SQLServer中的表进行行转列场景示例》本文详细介绍了SQLServer行转列(Pivot)的三种常用写法,包括固定列名、条件聚合和动态列名,文章还提供了实际示例、动态列数处理、性能优化建议... 目录一、常见场景示例二、写法 1:PIVOT(固定列名)三、写法 2:条件聚合(CASE WHEN)四、

Java 接口定义变量的示例代码

《Java接口定义变量的示例代码》文章介绍了Java接口中的变量和方法,接口中的变量必须是publicstaticfinal的,用于定义常量,而方法默认是publicabstract的,必须由实现类... 在 Java 中,接口是一种抽象类型,用于定义类必须实现的方法。接口可以包含常量和方法,但不能包含实例

线程池ThreadPoolExecutor应用过程

《线程池ThreadPoolExecutor应用过程》:本文主要介绍如何使用ThreadPoolExecutor创建线程池,包括其构造方法、常用方法、参数校验以及如何选择合适的拒绝策略,文章还讨论... 目录ThreadPoolExecutor构造说明及常用方法为什么强制要求使用ThreadPoolExec

Java中的CompletableFuture核心用法和常见场景

《Java中的CompletableFuture核心用法和常见场景》CompletableFuture是Java8引入的强大的异步编程工具,支持链式异步编程、组合、异常处理和回调,介绍其核心用法,通过... 目录1、引言2. 基本概念3. 创建 CompletableFuture3.1. 手动创建3.2.

Java线程池核心参数原理及使用指南

《Java线程池核心参数原理及使用指南》本文详细介绍了Java线程池的基本概念、核心类、核心参数、工作原理、常见类型以及最佳实践,通过理解每个参数的含义和工作原理,可以更好地配置线程池,提高系统性能,... 目录一、线程池概述1.1 什么是线程池1.2 线程池的优势二、线程池核心类三、ThreadPoolE

使用Redis实现会话管理的示例代码

《使用Redis实现会话管理的示例代码》文章介绍了如何使用Redis实现会话管理,包括会话的创建、读取、更新和删除操作,通过设置会话超时时间并重置,可以确保会话在用户持续活动期间不会过期,此外,展示了... 目录1. 会话管理的基本概念2. 使用Redis实现会话管理2.1 引入依赖2.2 会话管理基本操作

mybatis-plus分表实现案例(附示例代码)

《mybatis-plus分表实现案例(附示例代码)》MyBatis-Plus是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生,:本文主要介绍my... 目录文档说明数据库水平分表思路1. 为什么要水平分表2. 核心设计要点3.基于数据库水平分表注意事项示例

Mybatis的mapper文件中#和$的区别示例解析

《Mybatis的mapper文件中#和$的区别示例解析》MyBatis的mapper文件中,#{}和${}是两种参数占位符,核心差异在于参数解析方式、SQL注入风险、适用场景,以下从底层原理、使用场... 目录MyBATis 中 mapper 文件里 #{} 与 ${} 的核心区别一、核心区别对比表二、底

Nginx服务器部署详细代码实例

《Nginx服务器部署详细代码实例》Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务,:本文主要介绍Nginx服务器部署的相关资料,文中通过代码... 目录Nginx 服务器SSL/TLS 配置动态脚本反向代理总结Nginx 服务器Nginx是一个‌高性