使用线程池来创建线程的方法_线程池多线程实现

使用线程池来创建线程的方法_线程池多线程实现1.如何使用线程池来创建线程?java中提供了一个静态工厂方法来创建不同的线程池: Executors通过静态方法创建出的线程都实现了ExecutorService接口。常用的方法包括:newFixedThreadPool(intthreads);创建一个固定数目的线程池newCachedThreadPool();创建一个可缓存的线程池,调用execute方法将重用以前…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

1.如何使用线程池来创建线程?

java中提供了一个静态工厂方法来创建不同的线程池:  Executors

使用线程池来创建线程的方法_线程池多线程实现

通过静态方法创建出的线程都实现了ExecutorService接口。常用的方法包括:

newFixedThreadPool(int threads); 创建一个固定数目的线程池

newCachedThreadPool(); 创建一个可缓存的线程池,调用execute方法将重用以前创建的线程,如果没有可用线程则创建一个新的线程并添加到池中。终止并移除那些已经存在60s未被使用的线程。

newSingleThreadPoolExcutor() 创建一个单线程化的Excutor

newScheduledThreadPool(int corePoolSize) 创建一个定时及周期性执行任务的线程池。

实例: 在线程的基本介绍中有具体的使用方法:

 

2. 为什么不推荐使用jdk自带的executors的方式来创建线程池?

在阿里巴巴java开发手册中明确规定不允许使用Executors创建线程池。

使用线程池来创建线程的方法_线程池多线程实现

查看JDK源码:

使用线程池来创建线程的方法_线程池多线程实现

可以看到实现是实例化一个ThreadPoolExecutor,创建的阻塞队列为new LinkedBlockQueue。

java中的阻塞队列有两种 ArrayBlockingQueue LinkedBlockingQueue.

ArrayBlockingQueue是一个以数组设计的有界队列,必须设置大小

LinkedBlockingQueue 是一个以链表实现的有界阻塞队列,容量可以选择设置,不设置的话是无界的最大长度为Integer.MAX_VALUE。

所以说Executors创建线程池没有传入阻塞队列的长度,阻塞队列就是一个无边界队列,对于一个无边界队列来说是可以向其中无限添加任务的,这种情况下可能由于任务数太多而导致内存溢出。

FixedThreadPool和SingleThreadPool允许等待的请求队列是Integer.MAX_VALUE 可能导致内存溢出。 而CachedThreadPool和shceduledThreadPool允许创建的线程数量是Integer.MAX_VALUE 同样会出现内存溢出。

 

创建线程池的正确方式:

避免使用Executors创建线程池主要是为了避免其中的默认实现,可以改用ThreadPoolExecutor构造方法指定参数即可。

使用线程池来创建线程的方法_线程池多线程实现

需要指定核心线程池的大小、最大线程池的数量、保持存活的时间、等待队列容量的大小。在这种情况下一旦提交的线程数超过当前可用的线程数时就会抛出拒绝执行的异常 java.util.concurrent.RejectedExecutionException 有界队列已经满了便无法处理新的任务。

 

使用工具类来创建线程池:

除了自己定义的ThreadPool之外,还可以使用开源库 apache guava等。

个人推荐使用guava的ThreadFactoryBuilder() 来创建线程池:

使用线程池来创建线程的方法_线程池多线程实现

使用线程池来创建线程的方法_线程池多线程实现

使用上面的方法创建线程池不仅可以避免OOM的问题,还可以自定义线程名称,更加方便出错时溯源。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/179466.html原文链接:https://javaforall.net

(0)
上一篇 2022年10月21日 下午2:36
下一篇 2022年10月21日 下午2:46


相关推荐

  • QT西游回合制源码+java后台管理系统

    QT西游回合制源码+java后台管理系统这是一套回合制游戏源码 很适合学习

    2026年3月19日
    1
  • java在线反编译class文件工具地址

    java在线反编译class文件工具地址如下是可以在线反编译 class 文件的页面 方便开发者随时使用 在线编译地址 http javare cn

    2026年3月19日
    2
  • SPSS操作(四):系统聚类分析

    SPSS操作(四):系统聚类分析现用如下数据做系统聚类分析:将数据导入spss中,如图:步骤如下:①【分析】—-【分类】—-【系统聚类】②x2、x3、x4、x5、x6、x7、x8添加到变量,x1(即地区)添加到个案标注依据小技巧:添加变量的时候,可以单击【医疗机构床位数(张)】,然后按住shift键不松,鼠标单击【医院(个)】就可以选择多个变量一起添加③点击【统计】勾选【解的范围】,可以根据自己的需要选择最小聚类数和最大聚类数(这里我设置为2和5),然后点击【继续】④点击【图】,(这里我选择的是做系谱图

    2022年10月18日
    6
  • pytorch安装命令「建议收藏」

    pytorch安装命令「建议收藏」转自:https://blog.csdn.net/sunny_580/article/details/78958236pytorch安装命令OS :Linux, PackageManager :conda, Python :2.7, CUDA :7.5Runthiscommand: condainstallpytorchtorchvisioncuda75-c…

    2022年6月24日
    43
  • Centos7 搭建openldap完整详细教程(真实可用)

    Centos7 搭建openldap完整详细教程(真实可用)最近 由于公司需求 需要搭建 openldap 来统一用户名和密码 目前市面上几乎所有的工具都支持 ldap 协议 具体 ldap 的介绍这里就不详细说明了 这里主要记录一下如果部署 openldap 来实现 Ldap 服务 并使用 phpldapadmin 作为 web 管理工具进行界面维护 刚开始的时候 我百度了一下 openldap 的搭建 发现教程都比较乱 也没人说清楚个具体的所以然 还有一个说网上的

    2026年3月20日
    2
  • 解析MP4文件中的sps和pps[通俗易懂]

    解析MP4文件中的sps和pps[通俗易懂]一、MP4格式基本概念MP4格式对应标准MPEG-4标准(ISO/IEC14496) 二、MP4封装格式核心概念1 MP4封装格式对应标准为ISO/IEC14496-12(信息技术视听对象编码的第12部分:ISO基本媒体文件格式/InformationtechnologyCodingofaudio-visualobjectsPart12

    2022年8月31日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号