欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

线程池

程序员文章站 2022-05-04 17:16:19
...

池化技术:实现准备好资源,有人要用从我这里拿,用完了,还给我。

线程池的好处:

  • 减少资源的消耗,因为要用线程池的资源必定都是一些创建销毁都是很耗资源的东西。
  • 提高响应的速度
  • 管边管理

线程池的三大方法,7大参数,4种拒绝策略

注意:根据阿里巴巴代码规范,线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样
的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。
线程池

三大方法

# 创建一个容量的线程池
 Executors.newSingleThreadExecutor();
 # 创建固定容量的线程池
 Executors.newFixedThreadPool(5);
 # 创建弹性容量的线程池
 Executors.newCachedThreadPool();

三大方法的底层还是调用ThreadPollExecutor

public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }



 public static ExecutorService newFixedThreadPool(int nThreads) {
     return new ThreadPoolExecutor(nThreads, nThreads,
                                   0L, TimeUnit.MILLISECONDS,
                                   new LinkedBlockingQueue<Runnable>());
 }

public static ExecutorService newCachedThreadPool() {
    return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                  60L, TimeUnit.SECONDS,
                                  new SynchronousQueue<Runnable>());
}

七大参数就是ThreadPoolExecutor的七个构造参数

int corePoolSize,// 核心个数
int maximumPoolSize,// 最大个数
long keepAliveTime, // 超时多少就被销毁
TimeUnit unit,// 超时的单位
BlockingQueue<Runnable> workQueue,// 阻塞队列
ThreadFactory threadFactory,// 线程工厂
RejectedExecutionHandler handler// 拒绝策略

四种拒绝策略

线程池

AbortPolicy:队列满了,不处理,会抛出异常
CallerRunsPolicy:队列满了,哪来的回哪去,main线程调用的那就main处理
DiscardPolicy:队列满了,丢掉任务,不会抛出异常
DiscardOldestPolicy:队列满你了,会尝试和最早的线程竞争,如果失败了,也会丢掉任务,不会抛出异常

CPU密集型和IO密集型
一个计算为主的程序(专业一点称为CPU密集型程序)。多线程跑的时候,可以充分利用起所有的cpu核心,比如说4个核心的cpu,开4个线程的时候,可以同时跑4个线程的运算任务,此时是最大效率。
如果是一个磁盘或网络为主的程序(IO密集型)。一个线程处在IO等待的时候,另一个线程还可以在CPU里面跑,有时候CPU闲着没事干,所有的线程都在等着IO,这时候他们就是同时的了,而单线程的话此时还是在一个一个等待的。我们都知道IO的速度比起CPU来是慢到令人发指的。所以开多线程,比方说多线程网络传输,多线程往不同的目录写文件,等等。此时线程大于io数最好。

相关标签: 线程池