美文网首页一些收藏Java多线程多线程java
线程池的使用以及实现原理

线程池的使用以及实现原理

作者: 降龙_伏虎 | 来源:发表于2019-12-18 13:03 被阅读0次

线程池优点

  • 限流
    控制线程总数,根据硬件人为控制使性能达到最优
  • 复用
    减少线程的频繁创建和销毁复用线程
  • 效率
    因为线程可复用任务相应更快

java中的线程池

        Executors.newFixedThreadPool(nThreads);//固定线程数线程池
        Executors.newCachedThreadPool();//有伸缩性线程池,线程60shou后回收
        Executors.newSingleThreadExecutor();//只有一个核心线程的线程池
        Executors.newSingleThreadScheduledExecutor();//定时任务线程池
        Executors.newWorkStealingPool();//fork/join线程池
  • Executors核心构造方法
    public ThreadPoolExecutor(int corePoolSize,//核心线程数
                              int maximumPoolSize,//最大线程数
                              long keepAliveTime,//超时时间
                              TimeUnit unit,//超时时间单位
                              BlockingQueue<Runnable> workQueue,//缓冲队列
                              ThreadFactory threadFactory,//线程工厂
                              RejectedExecutionHandler handler//拒绝策略
 ) {
        if (corePoolSize < 0 ||
            maximumPoolSize <= 0 ||
            maximumPoolSize < corePoolSize ||
            keepAliveTime < 0)
            throw new IllegalArgumentException();
        if (workQueue == null || threadFactory == null || handler == null)
            throw new NullPointerException();
        this.corePoolSize = corePoolSize;
        this.maximumPoolSize = maximumPoolSize;
        this.workQueue = workQueue;
        this.keepAliveTime = unit.toNanos(keepAliveTime);
        this.threadFactory = threadFactory;
        this.handler = handler;
    }
  • newFixedThreadPool
    public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, //核心线程数=传入线程数
                                      nThreads,//最大线程数=传入线程数
                                      0L,//超时间=0
                                      TimeUnit.MILLISECONDS,//超时时间单位=秒
                                      new LinkedBlockingQueue<Runnable>()//双向链表阻塞队列
);
    }
  • newCachedThreadPool
    public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(
                                      0, //核心线程数=0
                                      Integer.MAX_VALUE,//最大线程数=Integer最大值(可当做无限大)
                                      60L, //超时时间=60
                                      TimeUnit.SECONDS,//超时时间单位=秒
                                      new SynchronousQueue<Runnable>()//不存储元素的阻塞队列
);
    }
  • newSingleThreadExecutor
public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 核心线程数=1
                                    1,//最大线程数=1
                                    0L,//超时时间0     
                                    TimeUnit.MILLISECONDS,//超时时间单位:毫秒
                                    new LinkedBlockingQueue<Runnable>()//双向链表阻塞队列
));
    }

执行流程图

image.png

问题

  • 1.不建议使用Executors创建线程池?为什么?
    Executors创建的线程池内置的参数,使开发人员在不用了解线程池各个参数的含义的情况下进行使用.
    在实际生产环境上运行是十分危险的
  • 2.线程池大小的设置?
    CPU 核数:
    IO密集型:每个线程执行时间长,cpu利用率低;可以多设置一些;CPU核数2或者 (线程等待时间+线程CUP时间)/线程CPU时间cup核数
    CUP密集型:cpu核数+1
    -3.线程池预热:
    ThreadPollExecutor.prestartAllCoreThreads()
  • 4 execute()与 submit()的区别
    submit(Callable<T>) 执行待返回值的任务,根据返回值可知任务的执行结果
    submit()不会抛出异常,异常根据Callable返回

相关文章

  • 线程以及java线程池实现分享

    线程以及java线程池实现分享 线程简介 JDK线程池的工作原理 JDK线程池的实现细节 1.线程简介-由来 1....

  • 线程池的原理

    参考 深入Java源码理解线程池原理 线程池是对CPU利用的优化手段 线程池使用池化技术实现,替他的实现还有连接池...

  • 线程池的原理解析

    线程池的原理 上一篇介绍了为什么要使用线程,以及创建线程的的几种方式。接下来将详细介绍线程的实现原理。 由源码可知...

  • 线程池的实现原理以及使用

    JAVA线程池的分析和使用 引言 合理利用线程池能带来三个好处: 降低资源消耗。通过重复利用已创建的线程降低线程创...

  • 一文搞懂Java线程池原理之ThreadPoolExecutor

    在工作中,我们经常使用线程池,但是你真的了解线程池的原理吗?同时,线程池工作原理和底层实现原理也是面试经常问的考题...

  • 安卓线程池概述

    提纲 是什么(使用线程池的原因,线程池的定义,好处,线程池原理) 怎么用(常见的使用方式,以及各个参数的作用) 为...

  • 源码分析AsyncTask的工作原理

    一、AsyncTask原理介绍 AsyncTask的实现原理 = 线程池+ Handler 其中:线程池用于线程调...

  • 第九章 线程池

    线程池的实现原理和使用建议。 当提交一个新任务到线程池时,线程池的处理流程如下。1)线程池判断核心线程池里的线程是...

  • 线程池的使用以及实现原理

    线程池优点 限流控制线程总数,根据硬件人为控制使性能达到最优 复用减少线程的频繁创建和销毁复用线程 效率因为线程可...

  • Java中线程池,你真的了解会用吗

    在《深入源码分析Java线程池的实现原理》这篇文章中,我们介绍过了Java中线程池的常见用法以及基本原理。 在文中...

网友评论

    本文标题:线程池的使用以及实现原理

    本文链接:https://www.haomeiwen.com/subject/krpdnctx.html