java创建线程池一共有七种方式

news/2024/11/8 0:29:40/

java创建线程池一共有七种方式

这 7 种实现方法分别是:

Executors.newFixedThreadPool:创建一个固定大小的线程池,可控制并发的线程数,超出的线程会在队列中等待。
Executors.newCachedThreadPool:创建一个可缓存的线程池,若线程数超过处理所需,缓存一段时间后会回收,若线程数不够,则新建线程。
Executors.newSingleThreadExecutor:创建单个线程数的线程池,它可以保证先进先出的执行顺序。
Executors.newScheduledThreadPool:创建一个可以执行延迟任务的线程池。
Executors.newSingleThreadScheduledExecutor:创建一个单线程的可以执行延迟任务的线程池。
Executors.newWorkStealingPool:创建一个抢占式执行的线程池(任务执行顺序不确定)【JDK 1.8 添加】。
ThreadPoolExecutor:手动创建线程池的方式,它创建时最多可以设置 7 个参数。

一、用ExecutorService创建线程池

//1.创建一个大小为10的线程池
ExecutorService threadPool= Executors.newFixedThreadPool(10);
//给线程池添加任务
for (int i = 0;i < 10;i++){threadPool.submit(new Runnable() {@Overridepublic synchronized void run(){//这里写你的方法log.info("开启线程..");}});
}

二、用ThreadPoolExecutor创建线程池

//1.创建一个大小为10的线程池
BlockingQueue queue = new LinkedBlockingQueue();
ThreadPoolExecutor executor= new ThreadPoolExecutor(10,Integer.MAX_VALUE,10L, TimeUnit.SECONDS,queue);
//给线程池添加任务
for (int i = 0;i < 10;i++){
executor.execute(new Runnable() {@Overridepublic synchronized void run(){//这里写你的方法log.info("开启线程..");}});
}

从根本上说ExecutorService算是通过ThreadPoolExecutor封装出来的他们的底层其实是一样的

ThreadPoolExecutor需要传参,而ExecutorService有默认值,值需要一个线程数量就可以了。

三、用ThreadPoolUtils工具类创建线程池

import com.google.common.util.concurrent.ThreadFactoryBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.util.concurrent.*;/*** 自定义线程创建工具类,创建线程池后不需要关闭** @author liangxn*/
public class ThreadPoolUtils {private static final Logger LOGGER = LoggerFactory.getLogger(ThreadPoolUtils.class);private static ThreadPoolExecutor threadPool = null;private static final String POOL_NAME = "myPool";// 等待队列长度private static final int BLOCKING_QUEUE_LENGTH = 1000;// 闲置线程存活时间private static final int KEEP_ALIVE_TIME = 5 * 1000;private ThreadPoolUtils() {throw new IllegalStateException("utility class");}/*** 无返回值直接执行** @param runnable 需要运行的任务*/public static void execute(Runnable runnable) {getThreadPool().execute(runnable);}/*** 有返回值执行* 主线程中使用Future.get()获取返回值时,会阻塞主线程,直到任务执行完毕** @param callable 需要运行的任务*/public static <T> Future<T> submit(Callable<T> callable) {return getThreadPool().submit(callable);}/*** 停止线程池所有任务* @return*/public static synchronized void shutdownNow() {getThreadPool().shutdownNow();}/*** 获取线程池中活跃线程数* @return*/public static int getActiveCount() {return getThreadPool().getActiveCount();}private static synchronized ThreadPoolExecutor getThreadPool() {if (threadPool == null) {// 获取处理器数量int cpuNum = Runtime.getRuntime().availableProcessors();// 根据cpu数量,计算出合理的线程并发数int maximumPoolSize = cpuNum * 2 + 1;// 核心线程数、最大线程数、闲置线程存活时间、时间单位、线程队列、线程工厂、当前线程数已经超过最大线程数时的异常处理策略threadPool = new ThreadPoolExecutor(maximumPoolSize - 1,maximumPoolSize,KEEP_ALIVE_TIME,TimeUnit.MILLISECONDS,new LinkedBlockingDeque<>(BLOCKING_QUEUE_LENGTH),new ThreadFactoryBuilder().setNameFormat(POOL_NAME + "-%d").build(),new ThreadPoolExecutor.AbortPolicy() {@Overridepublic void rejectedExecution(Runnable r, ThreadPoolExecutor e) {LOGGER.warn("线程爆炸了,当前运行线程总数:{},活动线程数:{}。等待队列已满,等待运行任务数:{}",e.getPoolSize(),e.getActiveCount(),e.getQueue().size());}});}return threadPool;}
}

http://www.ppmy.cn/news/730889.html

相关文章

表分区详解

目录 一、什么是表分区&#xff1f; 二、表分区与分表的区别 三、表分区有什么好处&#xff1f; 四、分区表的限制因素 五、如何判断当前MySQL是否支持分区&#xff1f; 六、MySQL支持的分区类型有哪些&#xff1f; 1、RANGE分区 2、LIST分区 3、HASH分区 4、KEY分区 …

MBR分区表格式与GPT分区表格式简介

MBR分区表格式与GPT分区表格式简介 一、MBR分区表格式的局限性二、GPT分区表格式的优势三、MBR分区表格式与GPT分区表格式的异同&#xff08;1&#xff09;BIOS&#xff1a;基本输入输出系统&#xff08;2&#xff09;UEFI&#xff1a;统一的可扩展固件接口 未初始化的全新硬盘…

db2 分区表

创建表空间、分区表、索引&#xff1b;初始分区表数据 db2 connect to saldev db2 "create tablespace tbs1 managed by database using ( file/dbfile/database/saldev/db2inst1/NODE0000/SALDEV/tbs1.bat 200M)" db2 "create tablespace tbs2 managed by data…

微信小程序实现抖音视频效果

当我们进行开发的时候可能会遇到需要实现抖音视频效果的需求&#xff0c;并且网上该效果的开源代码少&#xff0c;找到的开源代码代码量大&#xff0c;很难进行二次开发 对此我将自己的代码进行简化&#xff0c;仅留下可动性高的代码模块 以上是实现效果与此处demo的模板 wx…

hive 分区表select全部数据_hive分区表

内部表和外部表 内部表:create table,copy数据到warehouse,删除表时数据也会删除 外部表:create external table,不copy数据到warehouse,删除表时数据不会删除 表的分区 分区的好处:如果不建立分区的话,则会全表扫描 数据通过目录划分分区,分区字段是特殊字段 目录结构:…

mysql分区表truncate分区数据_详解MySQL分区表

前言: 分区是一种表的设计模式,通俗地讲表分区是将一大表,根据条件分割成若干个小表。但是对于应用程序来讲,分区的表和没有分区的表是一样的。换句话来讲,分区对于应用是透明的,只是数据库对于数据的重新整理。本篇文章给大家带来的内容是关于MySQL中分区表的介绍及使用…

android磁盘分区格式,转:磁盘分区表格式之android分区GPT

对于现在的系统来说,分区的类型千百种,但对于磁盘分区的layout来说,最常接触的只是三种而已: MBR(Master Boot Record), GPT(Globe Partition Table)和Apple Partition(Mixed分区)。 MBR分区表: 磁盘上最重要的数据结构,其中包含小段引导代码,磁盘信息,分区表等。在MBR…

磁盘接口,电脑sata mode 磁盘模式,磁盘分区表类型,bios mode

硬盘接口分为IDE、SATA、SCSI、光纤通道和SAS五种. IDE接口硬盘多用于家用产品中&#xff0c;也部分应用于服务器&#xff0c;现在已经淘汰.SCSI接口 是 Small Computer System Interface&#xff08;小型计算机系统接口&#xff09;的缩写&#xff0c;与普通IDE硬盘相比有很多…