👨🏻🎓博主介绍:大家好,我是芝士味的椒盐,一名在校大学生,热爱分享知识,很高兴在这里认识大家🌟
🌈擅长领域: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()); } }