线程池:三大方法、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;public class FunctionUse { public static void main(String[] args) {// Function
断定型接口:有一个输入参数,返回值只能是 布尔值!
package icu.lookyousmileface.functionfour;import java.util.function.Predicate;public class PredicateUse { public static void main(String[] args) { Predicate
Consumer 消费型接口
package icu.lookyousmileface.functionfour;import java.util.function.Consumer;public class ConsumerUse { public static void main(String[] args) { Consumer
Supplier 供给型接口
package icu.lookyousmileface.functionfour;import java.util.function.Supplier;public class SupplierUse { public static void main(String[] args) { Supplier