为什么所有的谈对象类软件都要收费打个字都不行而几万个游戏都不用收费能发信息什么狗高科技很难吗

文末有福利领取请耐心阅读哦~

線程池是为了提高程序执行效率,尽量减少线程对象类的创建和销毁的次数而产生的一种技术线程池内部维护了两个集合,一个是线程嘚集合另一个是任务集合。

线程池的好处是减少在创建和销毁线程上所消耗的时间以及系统资源的开销解决资源不足的问题。如果不使用线程池有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题。

阿里Java开发手册中强烈要求我们不允许使用Executors来創建线程池对象类而要通过ThreadPoolExecutor的方式,这是为什么呢下面就说一下我个人看法。


在开始之前我先给大家讲一下线程池的基本知识ThreadPoolExecutor有多個构造参数,但最终都会调用到下面的这个构造中来所以我直接讲参数最全的这个构造方法。

  • corePoolSize的作用是代表要开启核心线程数量核心線程会一直保留。

  • maximumPoolSize的作用是最大可以创建的线程数量当你的所有核心线程都在工作状态时,此时如果有新的任务需要执行系统就会创建新的线程来执行任务。

  • keepAliveTime代表新开启的线程如果执行完毕后可以存活多长时间如果在设置的时间内没有任务使用该线程,则线程资源就會归还操作系统

  • timeUnit 代表线程存活的时间单位。

  • workQueue 任务队列如果正在执行的任务超过了最大线程数,可以存放在队列中当线程池中有空闲資源就可以从队列中取出任务继续执行。

  • threadFactory 线程工厂他的作用是用来产生线程的,可以自定义线程的类型比如我们可以定义线程组名称,在jstack问题排查时非常有帮助。

  • rejectedExecutionHandler 拒绝策略, 当所有线程都在忙并且任务队列处于满任务的状态,则会执行拒绝策略

    拒绝策略可以自定义,JDK默认给我们提供了4种分别是:

    2.Discard: 直接扔掉最新的任务,不抛异常

    3.DiscardOldest: 扔掉排队时间最久的任务,也就是最旧的任务

Executors是一个工具类,直接使用Executors可以调用JDK为我们提供的线程池方法

  • newCachedThreadPool是一个可缓存的线程池,当线程池的线程数量大于需要执行的任务数量时则会在60秒后回收掉线程资源。

当任务量增加线程池也会创建出对应的线程来执行任务。

  • newFixedThreadPool是一个固定大小的线程池传入的参数是用来设置最大线程数的,如果此时线程都在执行状态则会向任务队列中放入任务。
  • newSingleThreadExecutor是一条单线程的线程池此线程池可以保证线程按照提交顺序来完成。

阿里的开發手册中的这些要求是基于他们的访问量来定义的并不是说我们所有公司都禁止使用Executors来创建线程池,毕竟我们大多数公司的业务访问量與阿里根本没得比

所以我们在日常开发时候还是可以用的,但这篇文章目的是让大家站在顶尖互联网公司角度去思考问题毕竟每个热愛编程的程序员最终梦想不都是进入BAT嘛,加油!!!

我的微信公众号【程序艺术杂谈】希望大家去关注,我会定期发一些原创文章分享給大家

关注后回复【阿里手册】即可领取《阿里JAVA开发手册——华山版》PDF

发布了18 篇原创文章 · 获赞 14 · 访问量 1万+

}

我要回帖

更多关于 对象类 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信