手动创建线程池_创建线程池的5个参数

手动创建线程池_创建线程池的5个参数一,Executors类不建议使用自带的工具类的!使用JDK自带的Executors工具类(图中蓝色框中的那个,这是独立于线程池继承关系图的工具类,类似于Collections和Arrays)可以直接创建以下种类的线程池线程数量固定的线程池,此方法返回ThreadPoolExecutorpublicstaticExecutorServicenewFixedThreadPool(intnThreads){……}单线程线程池,此方法返回ThreadPoolExecu

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

一,Executors类

不建议使用自带的工具类的!
使用 JDK 自带的 Executors工具类 (图中蓝色框中的那个,这是独立于线程池继承关系图的工具类,类似于 Collections 和 Arrays) 可以直接创建以下种类的线程池

线程数量固定的线程池,此方法返回
ThreadPoolExecutorpublic static ExecutorService newFixedThreadPool(int nThreads) {… …}
单线程线程池,此方法返回
ThreadPoolExecutorpublic static ExecutorService newSingleThreadExecutor() {… …}
可缓存线程的线程池,此方法返回
ThreadPoolExecutorpublic static ExecutorService newCachedThreadPool() {… …}
执行定时任务的线程池,此方法返回
ScheduledThreadPoolExecutorpublic static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {… …}
可以拆分执行子任务的线程池,此方法返回
ForkJoinPoolpublic static ExecutorService newWorkStealingPool() {… …}

我们可以发现他们得底层实现都是用了ThreadPoolExecutor,然而第五个参数使用到的阻塞队列默认值是Integer.MAX_VALUE,也就是
2147483647,这样就相当于是一个无界的队列。所有的请求都往里塞,最终造成OOM.

二,手动创建线程池

1.常用的线程池实现类是 ThreadPoolExecutor

/** * 各参数含义 * corePoolSize : 线程池中常驻的线程数量。核心线程数,默认情况下核心线程会一直存活,即使处于闲置状态也不会 * 受存活时间 keepAliveTime 的限制,除非将 allowCoreThreadTimeOut 设置为 true。 * maximumPoolSize : 线程池所能容纳的最大线程数。超过这个数的线程将被阻塞。当任务队列为没有设置大小的LinkedBlockingQueue时,这个值无效。 * keepAliveTime : 当线程数量多于 corePoolSize 时,空闲线程的存活时长,超过这个时间就会被回收 * unit : keepAliveTime 的时间单位 * workQueue : 存放待处理任务的队列 * threadFactory : 线程工厂 * handler : 拒绝策略,拒绝无法接收添加的任务 */
public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler) { 
    ... ... }

2.底层线程池实现的7大参数

corePoolSize:线程池中的常驻核心线程数
maximumPoolSize:线程池能够容纳同时执行的最大线程数,此值必须大于等于1
keepAliveTime:多余的空闲线程的存活时间
unit:keepAliveTime的单位
workQueue:任务队列,被提交但尚未被执行的任务。
threadFactory:表示生成线程池中工作线程的线程工厂,用于创建线程一般用默认
handler:拒绝策略,表示当队列满了并且工作线程大于等于线程池的最大线程数

3.工作原理

线程池的底层工作原理core基本线程数,当线程数大于corePoolSize时,多余线程将转入阻塞队列,阻塞队列也满了之后将扩容到maximumPoolSize数。
maximumPoolSize也满了之后将采取拒绝策略。当线程数小了之后,根据设定的空闲线程存活时间将线程总容量回缩到corePoolSize

4,使用可自定义线程名称的线程工厂

4.1,这个就简单多了,可以借助大名鼎鼎的谷歌开源工具库 Guava,首先引入如下依赖:

<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>28.2-jre</version>
</dependency>

4.2,自定义实现手动创建线程池

public class ThreadPoolDemo { 
   
// 线程数
    public static final int THREAD_POOL_SIZE = 16;

    public static void main(String[] args) throws InterruptedException { 
   
        // 使用 ThreadFactoryBuilder 创建自定义线程名称的 ThreadFactory
        ThreadFactory namedThreadFactory = new ThreadFactoryBuilder()
                .setNameFormat("hyn-demo-pool-%d").build();
        
        // 创建线程池,其中任务队列需要结合实际情况设置合理的容量
        ThreadPoolExecutor executor = new ThreadPoolExecutor(THREAD_P15OOL_SIZE,
                THREAD_POOL_SIZE,
                0L,
                TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<>(1024),
                namedThreadFactory,
                new ThreadPoolExecutor.AbortPolicy());
        
        // 新建 1000 个任务,每个任务是打印当前线程名称
        for (int i = 0; i < 1000; i++) { 
   
            executor.execute(() -> System.out.println(Thread.currentThread().getName()));
        }
        // 优雅关闭线程池
        executor.shutdown();
        executor.awaitTermination(1000L, TimeUnit.SECONDS);
        // 任务执行完毕后打印"Done"
        System.out.println("Done");
    }
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/187192.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Java课程设计—学生成绩管理系统(201521123004-林艺如)「建议收藏」

    Java课程设计—学生成绩管理系统(201521123004-林艺如)「建议收藏」1.团队课程设计博客"团队课程设计博客链接"2.个人负责模块或任务说明①.MenuMenu.jsp在页面中给出提示,用HTML的,与下一个跳转页面进行连接,即点击后进入下

  • 网页游戏制作_怎么制作app软件

    网页游戏制作_怎么制作app软件对于网页游戏是怎样制作的,你最起码要先学会html超文本标记语言再谈其他的工具方面我喜欢dreamweaver8.0图像及动画方面我喜欢photoshopcs3flash8.0用这三

  • 电子设计教程12:Buck降压电路

    电子设计教程12:Buck降压电路  我们仍然使用MC34063芯片,来设计一个DC-DC降压电路,实现直流12V转5V。Buck变换器  Buck变换器是开关电源基本拓扑结构的一种,Buck变换器又称为降压变换器,是一种对输入电压进行降压变换的直流斩波器,其输出电压低于输入电压。  Buck变换器与Boost变换器使用的器件完全一样,只不过连接方式不太一样。Buck电路是正激类型,在开关管导通的时候,能量可以传递到输出端。…

  • 抖音设备激活破解方法

    抖音设备激活破解方法,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • 漂亮的个人博客模板

    漂亮的个人博客模板2021年了,个人博客还有人做吗?确实现在已经比较少人写博客了吧,那么2021年了个人博客还能不做?我的回答是只要搜索引擎存在,无论是个人博客还是其它网站就会一直长存。

  • python检测字符串乱码

    python检测字符串乱码importchardetf=open(‘test.txt’,’rb’)f_read=f.read()f_charInfo=chardet.detect(f_read)print(f_charInfo)#f_charInfo的输出是这样的的一个字典{‘confidence’:0.99,’encoding’:’utf-8′}转载于:https://www.cnblogs.c…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号