论线程池化技术与其七大参数作用

线程池化技术那是相当的牛,它给我们每一个想要自主掌握线程的奥秘并且不被其扼住命运的咽喉的广大程序猿(媛)一丝喘息之地,换言之我们可以按照我们想要给客户指定的一系列需求来尽可能地呈现高效的线程并发与阻塞释放的弹性--人性化功能。

那么让我们了解一下这个伟大的工程是什么样子的吧,但正如伟大的数学家华罗庚所说的:数形结合百般好!我们将理论变为可视化的图像来进行拆分整合学习。

 所以说线程池这个东西就好像什么呢?它就像一个银行一样,每一个银行他都有属于自己的前台会有好几个窗口,但是有一些窗口是核心业务窗口,也就是说一直开着的不会关闭的窗口,因为一些窗口是备用的窗口。这些个备用的窗口在什么时候条件下会激活呢?答案在于你的候客区的那个位置是否在坐满的基础上还有人在外面排队,这个时候为了不让另外的顾客感到不耐烦,于是就会让现在已经处于候客区的那些客户到被激活上班了的备用窗口进行业务服务来缓解候客区的压力增大这个服务容量。那么线程池技术究竟是如何去体现这个特点的呢,这就需要我们对于线程池的七大参数有一定的了解。

线程池的七大参数分别的意义

 没错这就是七大参数:第一个叫corePoolSize就是我刚刚说的核心线程池容量;第二个maximumPoolSize就是线程池的最大容量;第三个值填写的是一个数字,至于这个数字将要发挥什么作用要看第四个参数——时间单位,你想设置成毫秒、秒、分钟还是小时了,这两个组合在一起便能够表示线程没有被调用可以存活不被踢出等待队列的最长时间;第五个表示我们要使用的阻塞队列的类型(一般而言的话就是new一个LinkedBlockingDeque或者ArrayBlockingDeque即可),它的容量决定了给等待的客人安排的座位有多少个;第六个线程工厂参数一般直接套用Executors.defaultThreadFactory()就可以;第七个参数是拒绝策略,这个我另起一行稍微提一下。

(1)AbortPolicy

AbortPolicyThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。

这种方式是非常简单粗暴地把后来的一并抛弃,abort这个单词在英语里面是流产的意思,你想想把腹中的胎儿打死了对母亲和baby都是惊人的损失啊,所以说一般来讲不是非常重要的业务要处理的时候咱们就尽量别用行吗?但在处理关键业务时就一定要用,否则会贬低其地位!

(2)DiscardPolicy

ThreadPoolExecutor.DiscardPolicy:丢弃任务,但是不抛出异常。如果线程队列已满,则后续提交的任务都会被丢弃,且是静默丢弃。

这个容易理解,既然呢个被我们大胆无视掉的线程想必也不围绕着很重要的事项,降低服务器的疲劳度的话可以用这个。

(3)DiscardOldestPolicy

ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新提交被拒绝的任务。

此拒绝策略,是一种喜新厌旧的拒绝策略。是否要采用此种拒绝策略,还得根据实际业务是否允许丢弃老任务来认真衡量。(始乱终弃容易遭报应!)

(4)CallerRunsPolicy

如果任务被拒绝了,则由调用线程(提交任务的线程,一般就是main方法主线程)直接执行此任务,我们可以通过代码来验证这一点:

public static void main(String[] args) {
 BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(10);
 ThreadFactory factory = r -> new Thread(r, "test-thread-pool");
 ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 5,
 0L, TimeUnit.SECONDS, queue, factory, new ThreadPoolExecutor.CallerRunsPolicy());
 for (int i = 0; i < 1000; i++) {
 executor.submit(() -> {
 try {
 System.out.println(Thread.currentThread().getName() + ":执行任务");
 Thread.sleep(1000);
 } catch (InterruptedException e) {
 e.printStackTrace();
 }
 });
 }
}
test-thread-pool:执行任务
main:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
main:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
main:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
main:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
main:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
main:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
main:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
main:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
main:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
main:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
main:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
main:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
main:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
main:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
main:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务
test-thread-pool:执行任务

好吧,这就是这个,我们再看几组jdk早就帮我们写好的线程池类型:

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

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

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

这三种说白了无非就是对那七个参数进行了默认或者在构造方法允许我们提供实参而已。single类型的前两个参数都是1,不需要所谓等待,因此第三个参数自然是0;cached类型的以0和int最大值分别作为第一第二参数说明了它遇强则强遇弱则弱。为了应变最坏情况的出现,就选择了一分钟的最长等待时间;fixed类型我们只需要指定一次传入的实参就可以确保其按照你想要的线程并发数进行100%功率的效果进行工作,同样的,这家伙可不需要所谓的阻塞队列等候时间!

夜已深,祝各位好梦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值