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());
        }
    }
相关文章
|
2天前
|
存储 安全 Java
Java中的容器,线程安全和线程不安全
Java中的容器,线程安全和线程不安全
9 1
|
2天前
|
存储 缓存 监控
Java线程池
Java线程池
14 1
|
2天前
|
存储 缓存 安全
Java并发基础之互斥同步、非阻塞同步、指令重排与volatile
在Java中,多线程编程常常涉及到共享数据的访问,这时候就需要考虑线程安全问题。Java提供了多种机制来实现线程安全,其中包括互斥同步(Mutex Synchronization)、非阻塞同步(Non-blocking Synchronization)、以及volatile关键字等。 互斥同步(Mutex Synchronization) 互斥同步是一种基本的同步手段,它要求在任何时刻,只有一个线程可以执行某个方法或某个代码块,其他线程必须等待。Java中的synchronized关键字就是实现互斥同步的常用手段。当一个线程进入一个synchronized方法或代码块时,它需要先获得锁,如果
21 0
|
3天前
|
设计模式 运维 安全
深入理解Java并发编程:线程安全与性能优化
【4月更文挑战第15天】在Java开发中,多线程编程是提升应用程序性能和响应能力的关键手段。然而,它伴随着诸多挑战,尤其是在保证线程安全的同时如何避免性能瓶颈。本文将探讨Java并发编程的核心概念,包括同步机制、锁优化、线程池使用以及并发集合等,旨在为开发者提供实用的线程安全策略和性能优化技巧。通过实例分析和最佳实践的分享,我们的目标是帮助读者构建既高效又可靠的多线程应用。
|
5天前
|
Java 程序员 编译器
Java中的线程同步与锁优化策略
【4月更文挑战第14天】在多线程编程中,线程同步是确保数据一致性和程序正确性的关键。Java提供了多种机制来实现线程同步,其中最常用的是synchronized关键字和Lock接口。本文将深入探讨Java中的线程同步问题,并分析如何通过锁优化策略提高程序性能。我们将首先介绍线程同步的基本概念,然后详细讨论synchronized和Lock的使用及优缺点,最后探讨一些锁优化技巧,如锁粗化、锁消除和读写锁等。
|
6天前
|
Java
探秘jstack:解决Java应用线程问题的利器
探秘jstack:解决Java应用线程问题的利器
14 1
探秘jstack:解决Java应用线程问题的利器
|
6天前
|
Java 调度 开发者
Java 21时代的标志:虚拟线程带来的并发编程新境界
Java 21时代的标志:虚拟线程带来的并发编程新境界
14 0
|
9天前
|
存储 Java 数据库连接
java多线程之线程通信
java多线程之线程通信
|
21天前
|
存储 缓存 NoSQL
Redis单线程已经很快了6.0引入多线程
Redis单线程已经很快了6.0引入多线程
31 3
|
23天前
|
消息中间件 安全 Linux
线程同步与IPC:单进程多线程环境下的选择与权衡
线程同步与IPC:单进程多线程环境下的选择与权衡
57 0

热门文章

最新文章