线程池的应用

首先在源码中我们知道了,线程池的添加线程,就是添加worker类到map里线程池的应用_第1张图片

然后运行worker里面的run方法,可通过创建线程池的时候,指定worker的容量,也就是线程池大小:

 

  ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2,
                5,
                1,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(3),
                Executors.defaultThreadFactory(), 
                new ThreadPoolExecutor.AbortPolicy());

从上至下依次是:

核心线程数量

最大线程数量

超时时间

时间单位

阻塞队列

线程工厂

拒绝策略

 核心线程指的是在请求不多的时候,只有这么多线程是活的

最大线程指的是线程池的最大容量

在请求很多的时候,核心线程已经满了,并且阻塞队列也满了,就会开启(最大线程数量-核心线程数量)的非核心线程,前提是阻塞队列已经满了。这就是开启非核心线程的前提条件。

超时时间则是:非核心线程空闲下来了,一旦空闲时间达到了这么久,就回收它。

拒绝策略也很有意思:

这次调用如果:阻塞队列满了报错(丢弃)、不报错(丢弃)、谁调用就让它自己执行、尝试获取闲暇的线程池执行。

线程池数量的定义:

使用最大cpu核心数量为最佳。

你可能感兴趣的:(多线程,java,开发语言)