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

使用线程池来创建线程的方法_线程池多线程实现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


相关推荐

  • apifox的使用_怎样能快速上手做表格

    apifox的使用_怎样能快速上手做表格快速上手使用场景Apifox是接口管理、开发、测试全流程集成工具,使用受众为整个研发技术团队,主要使用者为前端开发、后端开发和测试人员。前端开发接口文档管理接口数据Mock接口调试前

    2022年8月7日
    10
  • python获取字典长度_python字典操作

    python获取字典长度_python字典操作python 中字典用于存放具有映射关系的数据字典中的 key 不能相同字典中的 key 必须为不可变类型 所以可以是数 字符串 元组 但不能是列表创建字典通过 创建 dict1 eric 80 bob 90 dict2 通过函数 dict 创建 a eric 80 bob 90 dict3 dict a eric 80 bob

    2026年3月16日
    1
  • Spring的两种动态代理Jdk与Cglib

    Spring的两种动态代理Jdk与CglibSpring的两种动态代理Jdk与Cglib

    2022年4月23日
    40
  • 计算机原理 6.5 指令周期

    计算机原理 6.5 指令周期1、指令执行一般流程不同指令功能不同,数据通路不同,执行时间不同,如何安排时序?2、指令周期基本概念时钟周期=节拍脉冲=震荡周期作用:能完成一次微操作机器周期=cpu周期含义:从主存读出一

    2022年7月3日
    31
  • js正则使用变量_js正则表达式语法大全

    js正则使用变量_js正则表达式语法大全正常有变量evalnewRegExp

    2025年12月4日
    4
  • java volatile可见性解析

    java volatile可见性解析很长一段时间中对于volatile关键字都是一知半解的,由于工作中用的比较少,也没有对其深入了解,直到看了《深入理解java虚拟机》之后,才有进一步的了解。   volatile是java虚拟机提供的最轻量级的同步机制,只能作用于变来那个,具备两种特性:保证此变量对所有线程的可见性:可见性是指一旦一个线程修改了此变量的值,其他线程能立即得知。禁止指令的重排序(本文暂不涉及)由于vol

    2022年7月18日
    19

发表回复

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

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