Java并发JUC(java.util.concurrent)线程池

简介: Java并发JUC(java.util.concurrent)线程池

在这里插入图片描述

👨🏻‍🎓博主介绍:大家好,我是芝士味的椒盐,一名在校大学生,热爱分享知识,很高兴在这里认识大家🌟
🌈擅长领域:Java、大数据、运维、电子
🙏🏻如果本文章各位小伙伴们有帮助的话,🍭关注+👍🏻点赞+🗣评论+📦收藏,相应的有空了我也会回访,互助!!!
🤝另本人水平有限,旨在创作简单易懂的文章,在文章描述时如有错,恳请各位大佬指正,在此感谢!!!

@[TOC]

线程池是什么

  • 线程池:三大方法、7大参数、4种拒绝策略
  • 池化技术:事先准备好一些资源,有人要用,就来我这里拿,用完之后还给我。
  • 线程池好处:1、降低资源的消耗 2、提高响应的速度 3、方便管理。线程复用、可以控制最大并发数、管理线程
  • 提醒用图

    在这里插入图片描述

三大方法

  • 三大方法

    //也就是使用Executors工具类创建线程池的三种方法
    ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
    ExecutorService fixedThreadPool = Executors.newFixedThreadPool(10);
    ExecutorService singlePool = Executors.newSingleThreadExecutor();

四种策略

  • 四种策略

     * 4种策略
     * 银行总的人数:max+queue
     * new ThreadPoolExecutor.AbortPolicy()银行满了,再来人就会跑出异常
     * new ThreadPoolExecutor.CallerRunsPolicy()银行满了,让主线程执行
     * new ThreadPoolExecutor.DiscardPolicy()队列满了,丢掉任务,不报错
     * new ThreadPoolExecutor.DiscardOldestPolicy()银行满了,让进来的人和最开进银行的人进行线程竞争

七大参数

  • 七大参数

    ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                    2, //正常营业的两个窗口
                    5,//银行最大的窗口数
                    2,//当备用的3个窗口闲置时间超过此值,就会关闭线程(窗口)
                    TimeUnit.SECONDS,//闲置时间的单位
                    new LinkedBlockingQueue<>(3),//等待区等待数量阻塞队列,注意4组api
                    Executors.defaultThreadFactory(),//线程工程,默认不动
                    new ThreadPoolExecutor.DiscardPolicy()
            );

⚠️ Tips:池的最大的大小如何去设置!

IO密集型(Runtime.getRuntime().availableProcessors()),CPU密集型:(假设15个io业务,就需要设置成io业务的x2,也就是30,因为io业务非常占时间)

四大函数式接口

  • 函数式接口:只有一个方法的接口

    @FunctionalInterface 
    public interface Runnable { 
    public abstract void run(); 
    }
  • Function函数式接口

    package icu.lookyousmileface.functionfour;
    
    import java.util.function.Function;
    
    /**
     * @author starrysky
     * @title: FunctionUse
     * @projectName Juc_Pro
     * @description: Function,输入,返回啥
     * @date 2021/1/2911:37 下午
     */
    public class FunctionUse {
        public static void main(String[] args) {
    //        Function<String,String> functionInterface = new Function<String,String>() {
    //            @Override
    //            public String apply(String o) {
    //                System.out.println(o);
    //                return o;
    //            }
    //        };
    
    //        functionInterface.apply("你好");
        Function<String,String> functionInterface = (str)->{ System.out.println(str);return str;};
        functionInterface.apply("你好!");
        }
    }
  • 断定型接口:有一个输入参数,返回值只能是 布尔值!

    package icu.lookyousmileface.functionfour;
    
    import java.util.function.Predicate;
    
    /**
     * @author starrysky
     * @title: PredicateUse
     * @projectName Juc_Pro
     * @description: Predicat 判断输入的是否是想要的,返回boolean值
     * @date 2021/1/2911:45 下午
     */
    public class PredicateUse {
        public static void main(String[] args) {
            Predicate<String> predicate = (Str)->{
                if (Str!=null){
                    return true;
                }
                return false;
            };
            System.out.println(predicate.test(null));
        }
    }
  • Consumer 消费型接口

    package icu.lookyousmileface.functionfour;
    
    import java.util.function.Consumer;
    
    /**
     * @author starrysky
     * @title: ConsumerUse
     * @projectName Juc_Pro
     * @description: Consumer 消费型接口
     * @date 2021/1/2911:50 下午
     */
    public class ConsumerUse {
        public static void main(String[] args) {
            Consumer<String> consumer = (str)->{System.out.println("消费:"+str);};
            consumer.accept("5元");
        }
    }
  • Supplier 供给型接口

    package icu.lookyousmileface.functionfour;
    
    import java.util.function.Supplier;
    
    /**
     * @author starrysky
     * @title: SupplierUse
     * @projectName Juc_Pro
     * @description: Supplier 生产者接口
     * @date 2021/1/2911:53 下午
     */
    public class SupplierUse {
        public static void main(String[] args) {
            Supplier<Integer> supplier = ()->{return 1024;};
            System.out.println("supplier生产:"+supplier.get());
        }
    }
相关文章
|
1月前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
25天前
|
存储 监控 小程序
Java中的线程池优化实践####
本文深入探讨了Java中线程池的工作原理,分析了常见的线程池类型及其适用场景,并通过实际案例展示了如何根据应用需求进行线程池的优化配置。文章首先介绍了线程池的基本概念和核心参数,随后详细阐述了几种常见的线程池实现(如FixedThreadPool、CachedThreadPool、ScheduledThreadPool等)的特点及使用场景。接着,通过一个电商系统订单处理的实际案例,分析了线程池参数设置不当导致的性能问题,并提出了相应的优化策略。最终,总结了线程池优化的最佳实践,旨在帮助开发者更好地利用Java线程池提升应用性能和稳定性。 ####
|
22天前
|
监控 Java 开发者
深入理解Java中的线程池实现原理及其性能优化####
本文旨在揭示Java中线程池的核心工作机制,通过剖析其背后的设计思想与实现细节,为读者提供一份详尽的线程池性能优化指南。不同于传统的技术教程,本文将采用一种互动式探索的方式,带领大家从理论到实践,逐步揭开线程池高效管理线程资源的奥秘。无论你是Java并发编程的初学者,还是寻求性能调优技巧的资深开发者,都能在本文中找到有价值的内容。 ####
|
1月前
|
监控 安全 Java
在 Java 中使用线程池监控以及动态调整线程池时需要注意什么?
【10月更文挑战第22天】在进行线程池的监控和动态调整时,要综合考虑多方面的因素,谨慎操作,以确保线程池能够高效、稳定地运行,满足业务的需求。
113 38
|
29天前
|
存储 缓存 监控
Java中的线程池深度解析####
本文深入探讨了Java并发编程中的核心组件——线程池,从其基本概念、工作原理、核心参数解析到应用场景与最佳实践,全方位剖析了线程池在提升应用性能、资源管理和任务调度方面的重要作用。通过实例演示和性能对比,揭示合理配置线程池对于构建高效Java应用的关键意义。 ####
|
1月前
|
Prometheus 监控 Cloud Native
JAVA线程池监控以及动态调整线程池
【10月更文挑战第22天】在 Java 中,线程池的监控和动态调整是非常重要的,它可以帮助我们更好地管理系统资源,提高应用的性能和稳定性。
109 4
|
1月前
|
Prometheus 监控 Cloud Native
在 Java 中,如何使用线程池监控以及动态调整线程池?
【10月更文挑战第22天】线程池的监控和动态调整是一项重要的任务,需要我们结合具体的应用场景和需求,选择合适的方法和策略,以确保线程池始终处于最优状态,提高系统的性能和稳定性。
303 2
|
4月前
|
安全 Java 调度
解锁Java并发编程高阶技能:深入剖析无锁CAS机制、揭秘魔法类Unsafe、精通原子包Atomic,打造高效并发应用
【8月更文挑战第4天】在Java并发编程中,无锁编程以高性能和低延迟应对高并发挑战。核心在于无锁CAS(Compare-And-Swap)机制,它基于硬件支持,确保原子性更新;Unsafe类提供底层内存操作,实现CAS;原子包java.util.concurrent.atomic封装了CAS操作,简化并发编程。通过`AtomicInteger`示例,展现了线程安全的自增操作,突显了这些技术在构建高效并发程序中的关键作用。
77 1
|
1月前
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####
|
1月前
|
存储 设计模式 分布式计算
Java中的多线程编程:并发与并行的深度解析####
在当今软件开发领域,多线程编程已成为提升应用性能、响应速度及资源利用率的关键手段之一。本文将深入探讨Java平台上的多线程机制,从基础概念到高级应用,全面解析并发与并行编程的核心理念、实现方式及其在实际项目中的应用策略。不同于常规摘要的简洁概述,本文旨在通过详尽的技术剖析,为读者构建一个系统化的多线程知识框架,辅以生动实例,让抽象概念具体化,复杂问题简单化。 ####