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学习之路 | 提高篇】线程的通信
|
1天前
|
存储 Java
【JAVA学习之路 | 提高篇】线程安全问题及解决
【JAVA学习之路 | 提高篇】线程安全问题及解决
|
1天前
|
Java
【JAVA学习之路 | 提高篇】创建与启动线程之二(继承Thread类)(实现Runnable接口)
【JAVA学习之路 | 提高篇】创建与启动线程之二(继承Thread类)(实现Runnable接口)
|
1天前
|
Java 调度
【JAVA学习之路 | 提高篇】进程与线程(Thread)
【JAVA学习之路 | 提高篇】进程与线程(Thread)
|
1天前
|
Java 开发者
Java并发编程:理解线程同步和锁
【5月更文挑战第22天】本文将深入探讨Java并发编程的核心概念——线程同步和锁。我们将从基本的同步问题开始,逐步深入到更复杂的并发控制技术,包括可重入锁、读写锁以及Java并发工具库中的其他锁机制。通过理论与实例相结合的方式,读者将能够理解在多线程环境下如何保证数据的一致性和程序的正确性。
|
1天前
|
Java 程序员
Java中的多线程编程
本文将深入探讨Java中的多线程编程,包括线程的创建、启动、控制和同步等关键技术。我们将通过实例代码演示如何在Java中实现多线程,并讨论多线程编程的优势和挑战。
|
2天前
|
Java 容器
Java并发编程:深入理解线程池
【5月更文挑战第21天】 在多核处理器的普及下,并发编程成为了提高程序性能的重要手段。Java提供了丰富的并发工具,其中线程池是管理线程资源、提高系统响应速度和吞吐量的关键技术。本文将深入探讨线程池的核心原理、关键参数及其调优策略,并通过实例展示如何高效地使用线程池以优化Java应用的性能。
|
2天前
|
监控 算法 Java
Java并发编程:深入理解线程池
【5月更文挑战第21天】 在现代软件开发中,尤其是Java应用中,并发编程是一个不可忽视的重要领域。合理利用多线程可以显著提高程序的性能和响应速度。本文将深入探讨Java中的线程池机制,包括其工作原理、优势以及如何正确使用线程池来优化应用程序性能。通过分析线程池的核心参数配置,我们将了解如何根据不同的应用场景调整线程池策略,以期达到最佳的并发处理效果。
|
2天前
|
Java 调度 开发者
Java并发编程:深入理解线程池
【5月更文挑战第21天】本文旨在通过深入探讨Java并发编程的核心组件——线程池,为开发者提供对线程池的全面理解。我们将从线程池的基本概念、优势入手,逐步深入到线程池的核心原理、常用配置参数,以及如何合理地使用线程池来提高系统性能和稳定性。文章将结合实际案例,帮助读者掌握线程池的使用技巧,以及在面对不同场景时如何进行调优。
|
2天前
|
Java API
Java中的多线程编程:从理论到实践
【5月更文挑战第21天】 在现代软件开发中,多线程编程是一个不可或缺的技术,特别是在Java这种广泛使用的编程语言中。本文将深入探讨Java中的多线程编程,从基本概念到高级应用,包括线程的创建、同步、通信以及并发集合等。我们将通过实例和代码片段来说明这些概念,并提供一些最佳实践和注意事项,以帮助读者更好地理解和应用Java多线程编程。