zoukankan      html  css  js  c++  java
  • 【Java并发专题之十】juc-locks之线程池框架概述

    环境
      jdk version:jdk1.8.0_171

    一、Executor接口
    执行器接口,也是最顶层的抽象核心接口, 分离了任务和任务的执行。

    二、ExecutorService接口
    在Executor的基础上提供了执行器生命周期管理,任务异步执行等功能。
    在Executor的基础上增强了对任务的控制,同时包括对自身生命周期的管理,主要有四类:
    (1)关闭执行器,禁止任务的提交;
    (2)监视执行器的状态;
    (3)提供对异步任务的支持;
    (4)提供对批处理任务的支持。

    AbstractExecutorService,ExecutorService的抽象实现,为各类执行器类的实现提供基础。
    ThreadPoolExecutor,线程池Executor,也是最常用的Executor,可以以线程池的方式管理线程。

    三、ScheduledExecutorService接口
    在ExecutorService基础上提供了任务的延迟执行/周期执行的功能。ScheduledThreadPoolExecutor,在ThreadPoolExecutor基础上,增加了对周期任务调度的支持。

    四、Executors类
    生产具体的执行器的静态工厂,提供了五类可供创建的Executor执行器实例。
    1、固定线程数的线程池:在初始化时确定其中的线程总数,运行过程中会始终维持线程数量不变。

    /**
     * 创建一个具有固定线程数的Executor.
     */
    public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<Runnable>());
    }
    
    /**
     * 创建一个具有固定线程数的Executor.
     * 在需要时使用提供的 ThreadFactory 创建新线程.
     */
    public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) {
        return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<Runnable>(), threadFactory);
    
    }

    ThreadFactory,线程工厂,用于创建单个线程,减少手工创建线程的繁琐工作,同时能够复用工厂的特性。

    /**
     * 默认的线程工厂.
     */
    static class DefaultThreadFactory implements ThreadFactory {
        private static final AtomicInteger poolNumber = new AtomicInteger(1);
        private final ThreadGroup group;
        private final AtomicInteger threadNumber = new AtomicInteger(1);
        private final String namePrefix;
     
        DefaultThreadFactory() {
            SecurityManager s = System.getSecurityManager();
            group = (s != null) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup();
            namePrefix = "pool-" + poolNumber.getAndIncrement() + "-thread-";
        }
     
        public Thread newThread(Runnable r) {
            Thread t = new Thread(group, r, namePrefix + threadNumber.getAndIncrement(), 0);
            if (t.isDaemon())
                t.setDaemon(false);
            if (t.getPriority() != Thread.NORM_PRIORITY)
                t.setPriority(Thread.NORM_PRIORITY);
            return t;
        }
    }

    2、单个线程的线程池

    /**
     * 创建一个使用单个 worker 线程的 Executor.
     */
    public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
                (new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS,
                        new LinkedBlockingQueue<Runnable>()));
    }
     
    /**
     * 创建一个使用单个 worker 线程的 Executor.
     * 在需要时使用提供的 ThreadFactory 创建新线程.
     */
    public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) {
        return new FinalizableDelegatedExecutorService
                (new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS,
                        new LinkedBlockingQueue<Runnable>(), threadFactory));
    }

    3、可缓存的线程池:出于资源利用率的考虑,希望在特定的时候对线程进行回收(比如线程超过指定时间没有被使用)。

    /**
     * 创建一个可缓存线程的Execotor.
     * 如果线程池中没有线程可用, 则创建一个新线程并添加到池中;
     * 如果有线程长时间未被使用(默认60s, 可通过threadFactory配置), 则从缓存中移除.
     */
    public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS,
                new SynchronousQueue<Runnable>());
    }
     
    /**
     * 创建一个可缓存线程的Execotor.
     * 如果线程池中没有线程可用, 则创建一个新线程并添加到池中;
     * 如果有线程长时间未被使用(默认60s, 可通过threadFactory配置), 则从缓存中移除.
     * 在需要时使用提供的 ThreadFactory 创建新线程.
     */
    public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS,
                new SynchronousQueue<Runnable>(), threadFactory);
    }

    4、可延时/周期调度的线程池

    /**
     * 创建一个具有固定线程数的 可调度Executor.
     * 它可安排任务在指定延迟后或周期性地执行.
     */
    public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
        return new ScheduledThreadPoolExecutor(corePoolSize);
    }
     
    /**
     * 创建一个具有固定线程数的 可调度Executor.
     * 它可安排任务在指定延迟后或周期性地执行.
     * 在需要时使用提供的 ThreadFactory 创建新线程.
     */
    public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory) {
        return new ScheduledThreadPoolExecutor(corePoolSize, threadFactory);
    }

    5、Fork/Join线程池

    ForkJoinPool:Fork/Join线程池,在JDK1.7时引入,时实现Fork/Join框架的核心类。

    /**
     * 创建具有指定并行级别的ForkJoin线程池.
     */
    public static ExecutorService newWorkStealingPool(int parallelism) {
        return new ForkJoinPool(parallelism, ForkJoinPool.defaultForkJoinWorkerThreadFactory, null, true);
    }
     
    /**
     * 创建并行级别等于CPU核心数的ForkJoin线程池.
     */
    public static ExecutorService newWorkStealingPool() {
        return new ForkJoinPool(Runtime.getRuntime().availableProcessors(), ForkJoinPool.defaultForkJoinWorkerThreadFactory,
                null, true);
    }

    参考:

    executors框架总览

  • 相关阅读:
    《走近心理学》第一章之行为和心理学
    《解忧杂货铺》读书笔记
    追求得到之日即其终止之时, 寻觅的过程亦即失去的过程。——村上
    简朴的生活、高贵的灵魂是人生的至高境界。——杨绛
    Laravel Seeder
    Git的使用 checkout push merge
    基于 GraphQL 构建 Laravel API —— 基本使用篇
    awk基础04-内置函数
    awk基础03-分支和循环语句
    awk基础02-变量-分隔符-数组
  • 原文地址:https://www.cnblogs.com/cac2020/p/12208527.html
Copyright © 2011-2022 走看看