Java并发JUC

110 阅读3分钟

线程池的三大类型、七大参数和四大拒绝策略

  1. 三大方法
    当任务之间存在依赖关系,或需要严格保证执行顺序时,单线程池是理想选择。例如日志的写入工作,我希望日志可以按照时间顺序进行写入。
  2. 线程池用完需要手动关闭,否则程序不会退出
  3. 线程池中平时运行的线程是核心线程,当阻塞队列满了之后,如果设置的最大线程数是大于核心线程数的才会继续开辟新的线程,让新的线程加入到任务处理的行列
  4. 四大拒绝策略:队列满了抛出异常、队列满了不抛出异常、调用提交任务的线程执行、尝试移除最旧的任务并加入新的线程,如果失败就丢弃当前任务,也不会抛出异常
ExecutorService fixedThreadPool  = Executors.newFixedThreadPool(3);
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
// 固定线程池源码
public static ExecutorService newFixedThreadPool(int nThreads) {
    return new ThreadPoolExecutor( 
        nThreads, // 核心线程数(corePoolSize) 
        nThreads, // 最大线程数(maximumPoolSize) 
        0L, // 非核心线程的空闲线程存活时间(keepAliveTime) 
        TimeUnit.MILLISECONDS, // 时间单位 
        new LinkedBlockingQueue<Runnable>() // 任务队列 ); 
}
// 单线程线程池
public static ExecutorService newSingleThreadExecutor() {
    return new FinalizableDelegatedExecutorService(
        new ThreadPoolExecutor(
            1, //核心线程数=1,
            1, // 最大线程数=1(单线程)
            0L,// 非核心线程的空闲线程存活时间(同固定线程池逻辑,此处无效) 
            TimeUnit.MILLISECONDS,  // 时间单位
            new LinkedBlockingQueue<Runnable>()  // 任务队列
        )
    );
}
// 可伸缩线程池
public static ExecutorService newCachedThreadPool() {
    return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                  60L, TimeUnit.SECONDS,
                                  new SynchronousQueue<Runnable>());
}
//SynchronousQueue 是一个没有实际存储空间的阻塞队列,
/**`SynchronousQueue` 之所以被用于可伸缩线程池,是因为它不缓存任务、强制任务直接传递**的特性,完美适配了该线程池 “动态创建线程处理新任务、无任务时自动收缩” 的核心需求,确保了对突发任务的快速响应能力。*/

四大函数式接口

函数式接口

只要一个接口式函数式接口,就可以通过lambda表达式简写

断定型接口

只有一个传入参数,返回值是布尔类型!

供给型接口

没有输入只有返回值

消费型接口

只有输入没有返回值

你了解过Java的流式计算吗,能否展开讲讲

好的,下面我详细介绍一个流式计算,流式计算的API主要分为三类,第一类是获取流的API主要分为集合获取流和数组获取流。下面是代码:

// 如果是集合就.stream(),如果是数组就Arrays.stream();
// 集合获取流

List<Integer> numList = Arrays.asList(1, 2, 3, 4, 5);

Stream<Integer> stream = numList.stream(); // 串行流

// Stream<Integer> parallelStream = numList.parallelStream(); // 并行流

// 数组获取流

Integer[] numArr = {1, 2, 3, 4, 5};

Stream<Integer> arrStream = Arrays.stream(numArr);

中间操作主要有filter过滤操作,map数据格式转换操作,sorted排序操作,skip跳过前面n个元素,limit截取前面n个元素。

终端操作包括forEachcount统计元素个数,max获取最大值,min获取最小值,anyMatch是否有一个满足条件的元素,allMatch是否所有的元素都满足条件。collect将元素收集到指定容器(如列表、集合、Map)