java  ThreadPoolExecutor使用方法简单介绍

 更新时间:2017年02月17日 15:26:48   投稿:lqh  
这篇文章主要介绍了java ThreadPoolExecutor使用方法简单介绍的相关资料,需要的朋友可以参考下

java  ThreadPoolExecutor

前言:

在项目中如果使用发短信这个功能,一般会把发短信这个动作变成异步的,因为大部分情况下,短信到底是发送成功或者失败,都不能影响主流程。当然像发送MQ消息等操作也是可以封装成异步操作的。

使用基本的New Thread

如果想一个操作变成异步的,可以直接new thread,然后在run方法中实现业务操作即可。例如:

 new Thread(new Runnable() {
    public void run() {
      //发短信、发MQ消息等
    }
 });

但是这种方式有几个缺点。

1.每次都会new一个线程,执行完后销毁,不能复用;

2.如果系统的并发量刚好比较大,需要大量线程,那么这种每次new的方式会抢资源的。

ThreadPoolExecutor

我们可以使用jdk1.5中的ThreadPoolExecutor来封装异步操作。ThreadPoolExecutor的好处是可以做到线程复用,并且使用尽量少的线程去执行更多的任务,效率和性能都相当不错。demo代码如下:

public class ThreadPool {
  private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(8, 12, 30,
      TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(50000), new ThreadPoolExecutor.AbortPolicy());

  public static ThreadPoolExecutor getThreadPool() {
    return threadPool;
  }
}

参数介绍

public ThreadPoolExecutor(int corePoolSize,
               int maximumPoolSize,
               long keepAliveTime,
               TimeUnit unit,
               BlockingQueue<Runnable> workQueue,
               RejectedExecutionHandler handler) {

 }

corePoolSize:当workQueue队列中的元素还未到达最大值时,corePoolSize表示的池中线程数量的最大值;
maximumPoolSize:线程池中允许的最大线程数;
keepAliveTime:当前池中的线程数如果超过了corePoolSize,那么超出那些线程如果空闲太久了,应该需要销毁的。keepAliveTime就是的是这些线程的最大空闲时间;
unit:keepAliveTime的时间单位;
workQueue:当池中线程数的数量已经达到了corePoolSize,那么如果请求还继续过来,会把请求对应的task放入队列中;
handler:当workQueue满了,池中的线程数又达到了maximumPoolSize,这个时候已经没有多余的资源处理请求了,需要RejectedExecutionHandler 来处理。拒绝处理或者丢弃任务等等。

执行过程

当没有请求时,线程池中没有任何线程;

当有请求时,创建线程,一直到池中的线程数等于corePoolSize;

如果请求太多,需要更多的线程来处理的话,ThreadPoolExecutor选择把请求放入队列中,暂时不新建线程;

如果workQueue也满了,ThreadPoolExecutor会继续创建线程,直到线程数量跟maximumPoolSize相等;

线程数达到maximumPoolSize了,同时workQueue也慢了,就只能把请求丢给RejectedExecutionHandler 来处理。

备注

使用ThreadPoolExecutor时,需要根据自己的业务情况,适当的指定参数值的大小。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • 在SpringBoot中注入RedisTemplate实例异常的解决方案

    在SpringBoot中注入RedisTemplate实例异常的解决方案

    这篇文章主要介绍了在SpringBoot中注入RedisTemplate实例异常的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Java 异常机制Exception和自定义异常

    Java 异常机制Exception和自定义异常

    这篇文章主要介绍了Java 异常机制Exception+自定义异常,异常分三种检查性异常、运行时异常、错误ERROR,下文对其更多详细介绍,需要的小伙伴可以参考一下
    2022-05-05
  • springboot集成shiro详细总结

    springboot集成shiro详细总结

    这几天在看 shiro,用 springboot 集成了一下,下面的这个例子中主要介绍了 shiro 的认证和授权,以及盐值加密的功能.程序可以运行起来.这里只做一个简单的介绍,后续会针对各个功能做一个详细的介绍,这里不做过多的赘述,需要的朋友可以参考下
    2021-05-05
  • 浅谈springboot之JoinPoint的getSignature方法

    浅谈springboot之JoinPoint的getSignature方法

    这篇文章主要介绍了springboot之JoinPoint的getSignature方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • 详解Java利用ExecutorService实现同步执行大量线程

    详解Java利用ExecutorService实现同步执行大量线程

    这篇文章主要介绍了Java利用ExecutorService实现同步执行大量线程,ExecutorService可以维护我们的大量线程在操作临界资源时的稳定性。
    2017-03-03
  • java实现简单验证码生成

    java实现简单验证码生成

    这篇文章主要介绍了java实现简单验证码生成,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • SpringBoot Admin健康检查功能的实现

    SpringBoot Admin健康检查功能的实现

    admin主要就是告诉运维人员,服务出现异常,然后进行通知(微信、邮件、短信、钉钉等)可以非常快速通知到运维人员,相当报警功能,接下来通过本文给大家介绍SpringBoot Admin健康检查的相关知识,一起看看吧
    2021-06-06
  • 解决idea中javaweb的mysql8.0.15配置问题

    解决idea中javaweb的mysql8.0.15配置问题

    这篇文章主要介绍了idea中javaweb的mysql8.0.15配置问题 ,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • mybatis配置mapper-locations位置的三种方式小结

    mybatis配置mapper-locations位置的三种方式小结

    这篇文章主要给大家介绍了关于mybatis配置mapper-locations位置的三种方式,Mybatis-Plus的初衷是为了简化开发,而不建议开发者自己写SQL语句的,但是有时客户需求比较复杂,需要的朋友可以参考下
    2023-08-08
  • Quartz之Job与JobDetail深入解析

    Quartz之Job与JobDetail深入解析

    下面小编就为大家带来一篇Quartz之Job与JobDetail深入解析。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06

最新评论