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

使用线程池来创建线程的方法_线程池多线程实现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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • gpio引脚介绍 树莓派3b_树莓派3bgpio引脚介绍[通俗易懂]

    gpio引脚介绍 树莓派3b_树莓派3bgpio引脚介绍[通俗易懂]第4章GPIO接口本章内容:?GPIO接口时通用输入输出端口,通俗的说,就是一些引脚,可以通过它们输出高低电平或者通过它们读入引脚状态——是高电平还是低电平。…更强的“盒子”树莓派3B型主板性能、功能增强,带来更广泛的应用领域。树莓派3B保持了B型树莓派的外形尺寸和接口布局,而性能升级是它最大的变化,……树莓派3B系列的人脸识别实验室门禁系统朱琳,…

    2022年6月25日
    33
  • pycharm整理格式快捷键_python代码对齐快捷键

    pycharm整理格式快捷键_python代码对齐快捷键格式化代码快捷键:ctrl+alt+L常用快捷键编辑类:Ctrl+D复制选定的区域或行Ctrl+Y删除选定的行Ctrl+Alt+L代码格式化Ctrl+Alt+O优化导入(去掉用不到的包导入)Ctrl+鼠标简介/进入代码定义Ctrl+/行注释、取消注释Ctrl+左方括号快速跳到代码开头Ctrl+右方括号快速跳到代码末尾Shift

    2022年8月28日
    4
  • 每个人都应该知道的25个Git命令

    每个人都应该知道的25个Git命令

    2022年2月19日
    44
  • 笔记本卡顿不流畅是什么原因_笔记本卡顿不流畅是什么原因_笔记本电脑卡顿不流畅如何解决-win7之家…「建议收藏」

    笔记本卡顿不流畅是什么原因_笔记本卡顿不流畅是什么原因_笔记本电脑卡顿不流畅如何解决-win7之家…「建议收藏」有不少笔记本电脑用户在使用过程中,发现会经常会遇到卡顿不流畅的情况,很多用户不知道是什么原因引起的,其实原因有很多,可能是电脑本身配置不足,或者电脑占用率过高,或者内存不足等,接下来给大家带来笔记本电脑卡顿不流畅的详细解决方法吧。具体步骤如下:1、CPU不足电脑卡顿很多时候都是因为CPU占用过高,实质还是CPU太小引起的,我们可以将多余的进程或者软件关闭,或者更换性能好的CPU来解决这个问题,电脑…

    2025年10月30日
    6
  • c# dynamic用法_dynamic_cast详解

    c# dynamic用法_dynamic_cast详解dynamic是FrameWork4.0的新特性。dynamic的出现让C#具有了弱语言类型的特性。编译器在编译的时候不再对类型进行检查,编译期默认dynamic对象支持你想要的任何特性。比如,即使你

    2022年8月4日
    7
  • kafka 查看topic offset_kafka重置offset

    kafka 查看topic offset_kafka重置offset版本信息Kafka0.8.2,JDK1.7问题现象最近我们在生产环境执行删除无用的kafkatopic的操作时,因为错误的按照8.2版本之前的删除方式操作8.2.2版本的kafka,导致删除过程异常,删除后出现consumer正在消费的其他正常topic的partition的offset值偏移的情况,导致大量消息重复消费,并且产生连锁反应,给我们的系统稳定性产生明显影响。如下日志所示,正常情况…

    2022年10月10日
    3

发表回复

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

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