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

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


相关推荐

  • 递归迭代动态规划「建议收藏」

    递归迭代动态规划「建议收藏」一、定义递归:程序调用自身,从顶部将问题分解,其问题与其子问题是同一概念。通过解决掉所有分解出来的小问题,来解决整个问题。迭代:利用变量的原值推算出变量的下一个值。递归中一定有迭代,但是迭代中不一定有递归。动态规划:通常与递归相反,其从底部开始解决问题。将所有小问题解决掉,进而解决的整个问题。为了节约重复求相同子问题的时间,引入一个数组,把所有子问题的解存于该数组中,动态规划算法是空间换时间的算法。动态规划可以递归地实现,也可以非递归(循环的方法)地实现。运行速度:动态规划>迭代&gt

    2025年7月1日
    4
  • 【图】用python实现有向图

    【图】用python实现有向图通过临界表的方式实现了图结构 classVertex object 节点对象 def init self key self key keyself connectedTo 存放指向的其它节点 以 Vertex 连接边 weight 的 defaddNeighb self nbr weight self connectedTo update nbr

    2025年11月13日
    3
  • BS架构和CS架构的优缺点

    BS架构和CS架构的优缺点1、CS、BS架构定义  CS(Client/Server):客户端—-服务器结构。C/S结构在技术上很成熟,它的主要特点是交互性强、具有安全的存取模式、网络通信量低、响应速度快、利于处理大量数据。因为客户端要负责绝大多数的业务逻辑和UI展示,又称为胖客户端。它充分利用两端硬件,将任务分配到Client和Server两端,降低了系统的通讯开销。C/S结构的软件需要针对不同的操作系

    2022年6月25日
    30
  • axios如何跨域请求_前端跨域请求

    axios如何跨域请求_前端跨域请求axios跨域请求详情写这篇文章的背景是因为之前遇到的,在跨域的情况下通过axios发起的get请求正常,post请求会在正式请求发送之前先发送一个opstions请求,而后端接口没有兼容options,导致404的情况。而在解决这个问题时带着好奇心顺带查了一下,给自己补充了些知识点跨域请求分两种简单讲,从JavaScript代码发起的XMLHttpRequest请求可以分为两种:不会触发CORS预检的请求,而是直接向服务端发送请求,什么是CORS预检咱们后面

    2025年10月27日
    3
  • Web中常用的Javascript技巧(1)「建议收藏」

    Web中常用的Javascript技巧(1)

    2022年3月8日
    36
  • java中session的用法与原理

    java中session的用法与原理https://www.cnblogs.com/xdp-gacl/p/3855702.htmlsession简介在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的s…

    2022年7月12日
    15

发表回复

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

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