Java手动配置线程池过程详解

 更新时间:2020年05月12日 10:55:10   作者:护花使者  
这篇文章主要介绍了Java手动配置线程池过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

线程池中,常见有涉及到的:

ExecutorService executorService = Executors.newSingleThreadExecutor();
ExecutorService executorService1 = Executors.newCachedThreadPool();
ExecutorService executorService2 = Executors.newFixedThreadPool(3);

关于Executors和ExecutorService从记忆上类似于Collections和List。

但是以上几种其实不建议使用。最好可以通过自己手动配置ThreadPoolExecutor的形式。

我先创建一个demo:

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

涉及7个参数,按顺序分别是

int corePoolSize, 
int maximumPoolSize, 
long keepAliveTime, 
TimeUnit unit, 
BlockingQueue<Runnable> workQueue, 
ThreadFactory threadFactory, 
RejectedExecutionHandler handler

具体我首先需要结合参数解释下线程池的执行原理:

画了张图:

如果我用银行办理业务示例说明如下:

1、首先银行里面有两个柜台,这就是核心线程数(7大参数之一)。

2、然后随着客户的增加,可能这个两个柜台满了,然后就要请用户到等候区里面进行等待。这个等候区就是相当于阻塞队列(七大参数之一)。

3、然后紧接着客户越来越多,连阻塞队列都撑不住了,这个时候,就要请求,上面的领导进行多增加柜台的操作,这个时候,可能加了三个柜台,现在就有5个柜台了。这个时候最大的线程数(七大参数之一)就是5了。

4、但是这个时候可能客户又越来越多,这个时候新加的柜台也受不了,就要开始有拒绝策略了(七大参数之一)

5、然后过了一段时间,慢慢的,客户越来越少了,这个时候,发现渐渐的,柜台空余出来了。KeepAliveTime(七大参数之一,加上单位,合计两个参数)指当线程数大于核心线程数时,此为终止前多余的空闲线程等待新任务的最长时间。

6、还有一个参数是工厂,这个我们不做深入研究,直接用默认的工厂即可。

懂得原理以后,我们可以查看下,为什么最好不要直接用,比如:

Executors.newFixedThreadPool(3);

这个的主要原因就是这里面默认队列的最大值是Integer的最大值。

所以我们生产中需要自己配置线程池。因为默认队列的长度太长了,有可能会导致oom。就是内存炸掉了。

这个在阿里的编程思想里面也有说明这一点:

这边我们探讨下,拒绝策略。4种策略。就是所有柜台和等候区全部满了。会如何处理。

用非常easy的代码来过下,这块的内容:

1、AbortPolicy

import java.util.concurrent.*;

public class VolatileTest {
  public static void main(String[] args) throws Exception {
    ExecutorService executorService = new ThreadPoolExecutor(
        2,
        5,
        1L,
        TimeUnit.SECONDS,
        new ArrayBlockingQueue<Runnable>(3),
        Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy()
    );

    try {
      for (int i = 0; i < 9; i++) {
        executorService.execute(new Runnable() {
          @Override
          public void run() {
            System.out.println(Thread.currentThread().getName()+"\t"+"办理业务");
          }
        });
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
    }

  }
}

可以看到如果超出的话直接挂了,阻止正常运行。

2、CallerRunsPolicy

输出

发现有一个退回main线程,被main线程处理。即会把任务退回至调用者。

3、DiscardOldestPolicy

这个将会等待时间最久的任务丢掉。

4、DiscardPolicy

多出来的任务会全部丢掉。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot继承LogStash实现日志收集的方法示例

    SpringBoot继承LogStash实现日志收集的方法示例

    这篇文章主要介绍了SpringBoot继承LogStash实现日志收集的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05
  • Java8中List转换String字符串几种方式

    Java8中List转换String字符串几种方式

    这篇文章主要给大家介绍了关于Java8中List转换String字符串的几种方式,在实际开发中经常遇到List转为String字符串的情况,文中给出了几种方法的示例代码,需要的朋友可以参考下
    2023-07-07
  • Springboot 整合RabbitMq(用心看完这一篇就够了)

    Springboot 整合RabbitMq(用心看完这一篇就够了)

    这篇文章主要介绍了Springboot 整合RabbitMq(用心看完这一篇就够了),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 详解Java如何实现多线程步调一致

    详解Java如何实现多线程步调一致

    本章节主要讲解另外两个线程同步器:CountDownLatch和CyclicBarrier的用法,使用场景以及实现原理,感兴趣的小伙伴可以了解一下
    2023-07-07
  • Java后台生成图片的完整步骤

    Java后台生成图片的完整步骤

    在一些详情页面中,可能需要对上传到服务器中的图片生成以缩略图的形式展示,这篇文章主要给大家介绍了关于Java后台生成图片的相关资料,需要的朋友可以参考下
    2021-08-08
  • SpringBoot实现本地存储文件上传及提供HTTP访问服务的方法

    SpringBoot实现本地存储文件上传及提供HTTP访问服务的方法

    这篇文章主要介绍了SpringBoot实现本地存储文件上传及提供HTTP访问服务,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • 基于JavaMail API收发邮件的方法

    基于JavaMail API收发邮件的方法

    这篇文章主要介绍了基于JavaMail API收发邮件的方法,实例分析了javamail的使用方法与相关注意事项,非常具有实用价值,需要的朋友可以参考下
    2015-07-07
  • 解决Feign切换client到okhttp无法生效的坑(出现原因说明)

    解决Feign切换client到okhttp无法生效的坑(出现原因说明)

    这篇文章主要介绍了解决Feign切换client到okhttp无法生效的坑(出现原因说明),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • 基于maven实现私服搭建步骤图解

    基于maven实现私服搭建步骤图解

    这篇文章主要介绍了基于maven实现私服搭建步骤图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • Spring Boot之过滤器 Filter注入的方式解析

    Spring Boot之过滤器 Filter注入的方式解析

    这篇文章主要介绍了Spring Boot之过滤器 Filter注入的方式解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11

最新评论