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());
        }
    }
相关文章
|
7天前
|
安全 Java 开发者
深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
28 9
|
10天前
|
存储 安全 Java
Java多线程编程的艺术:从基础到实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及其实现方式,旨在帮助开发者理解并掌握多线程编程的基本技能。文章首先概述了多线程的重要性和常见挑战,随后详细介绍了Java中创建和管理线程的两种主要方式:继承Thread类与实现Runnable接口。通过实例代码,本文展示了如何正确启动、运行及同步线程,以及如何处理线程间的通信与协作问题。最后,文章总结了多线程编程的最佳实践,为读者在实际项目中应用多线程技术提供了宝贵的参考。 ####
|
7天前
|
监控 安全 Java
Java中的多线程编程:从入门到实践####
本文将深入浅出地探讨Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的摘要形式,本文将以一个简短的代码示例作为开篇,直接展示多线程的魅力,随后再详细解析其背后的原理与实现方式,旨在帮助读者快速理解并掌握Java多线程编程的基本技能。 ```java // 简单的多线程示例:创建两个线程,分别打印不同的消息 public class SimpleMultithreading { public static void main(String[] args) { Thread thread1 = new Thread(() -> System.out.prin
|
9天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
10天前
|
Java
java小知识—进程和线程
进程 进程是程序的一次执行过程,是系统运行的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如CPU时间,内存空间,文件,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。 线程 线程,与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间做切换工作时,负担要比
22 1
|
6月前
|
Java 调度
Java并发编程:深入理解线程池的原理与实践
【4月更文挑战第6天】本文将深入探讨Java并发编程中的重要概念——线程池。我们将从线程池的基本原理入手,逐步解析其工作过程,以及如何在实际开发中合理使用线程池以提高程序性能。同时,我们还将关注线程池的一些高级特性,如自定义线程工厂、拒绝策略等,以帮助读者更好地掌握线程池的使用技巧。
|
3月前
|
安全 Java 数据库
一天十道Java面试题----第四天(线程池复用的原理------>spring事务的实现方式原理以及隔离级别)
这篇文章是关于Java面试题的笔记,涵盖了线程池复用原理、Spring框架基础、AOP和IOC概念、Bean生命周期和作用域、单例Bean的线程安全性、Spring中使用的设计模式、以及Spring事务的实现方式和隔离级别等知识点。
|
2月前
|
存储 缓存 Java
JAVA并发编程系列(11)线程池底层原理架构剖析
本文详细解析了Java线程池的核心参数及其意义,包括核心线程数量(corePoolSize)、最大线程数量(maximumPoolSize)、线程空闲时间(keepAliveTime)、任务存储队列(workQueue)、线程工厂(threadFactory)及拒绝策略(handler)。此外,还介绍了四种常见的线程池:可缓存线程池(newCachedThreadPool)、定时调度线程池(newScheduledThreadPool)、单线程池(newSingleThreadExecutor)及固定长度线程池(newFixedThreadPool)。
|
4月前
|
监控 Java 开发者
深入理解Java并发编程:线程池的原理与实践
【5月更文挑战第85天】 在现代Java应用开发中,高效地处理并发任务是提升性能和响应能力的关键。线程池作为一种管理线程的机制,其合理使用能够显著减少资源消耗并优化系统吞吐量。本文将详细探讨线程池的核心原理,包括其内部工作机制、优势以及如何在Java中正确实现和使用线程池。通过理论分析和实例演示,我们将揭示线程池对提升Java应用性能的重要性,并给出实践中的最佳策略。
|
4月前
|
设计模式 存储 安全
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
62 1