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());
        }
    }
相关文章
|
8天前
|
设计模式 缓存 安全
【JUC】(6)带你了解共享模型之 享元和不可变 模型并初步带你了解并发工具 线程池Pool,文章内还有饥饿问题、设计模式之工作线程的解决于实现
JUC专栏第六篇,本文带你了解两个共享模型:享元和不可变 模型,并初步带你了解并发工具 线程池Pool,文章中还有解决饥饿问题、设计模式之工作线程的实现
44 2
|
8天前
|
设计模式 消息中间件 安全
【JUC】(3)常见的设计模式概念分析与多把锁使用场景!!理解线程状态转换条件!带你深入JUC!!文章全程笔记干货!!
JUC专栏第三篇,带你继续深入JUC! 本篇文章涵盖内容:保护性暂停、生产者与消费者、Park&unPark、线程转换条件、多把锁情况分析、可重入锁、顺序控制 笔记共享!!文章全程干货!
50 1
|
8天前
|
Java 测试技术 API
【JUC】(1)带你重新认识进程与线程!!让你深层次了解线程运行的睡眠与打断!!
JUC是什么?你可以说它就是研究Java方面的并发过程。本篇是JUC专栏的第一章!带你了解并行与并发、线程与程序、线程的启动与休眠、打断和等待!全是干货!快快快!
191 2
|
8天前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
53 1
|
8天前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
43 1
|
9天前
|
缓存 安全 Java
JUC系列之《CountDownLatch:同步多线程的精准发令枪 》
CountDownLatch是Java并发编程中用于线程协调的同步工具,通过计数器实现等待机制。主线程等待多个工作线程完成任务后再继续执行,适用于资源初始化、高并发模拟等场景,具有高效、灵活、线程安全的特点,是JUC包中实用的核心组件之一。
|
1月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
76 0
|
1月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
118 16
|
2月前
|
缓存 并行计算 安全
关于Java多线程详解
本文深入讲解Java多线程编程,涵盖基础概念、线程创建与管理、同步机制、并发工具类、线程池、线程安全集合、实战案例及常见问题解决方案,助你掌握高性能并发编程技巧,应对多线程开发中的挑战。