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

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


相关推荐

  • redis面试必会6题经典_关于redis秒杀的面试题

    redis面试必会6题经典_关于redis秒杀的面试题Redis面试题1、什么是Redis?.2、Redis的数据类型?3、使用Redis有哪些好处?4、Redis相比Memcached有哪些优势?5、Memcache与Redis的区别都有哪些?6、Redis是单进程单线程的?7、一个字符串类型的值能存储最大容量是多少?8、Redis的持久化机制是什么?各自的优缺点?9、Redis常见性…

    2022年9月3日
    4
  • html里面超链接alt_怎样用HTML代码在图片插入超链接[通俗易懂]

    html里面超链接alt_怎样用HTML代码在图片插入超链接[通俗易懂]展开全部1、图像链接图片超链接和文字超链接是一样的,在e5a48de588b63231313335323631343130323136353331333366306533图像上插入链接:点击图片,跳转页面:之间插入元素。如:。(如图)2、局部链接在某种情况下,我们不希望整张图片加链接。希望的效果是:点击图片某个区域,链接到某地址。是通过map标签和标签结合使用的。如:(1)、(2)、扩展资料:元素…

    2022年7月15日
    11
  • linux udp端口怎么打开_debian防火墙开放端口

    linux udp端口怎么打开_debian防火墙开放端口iptables是linux下的防火墙,同时也是服务名称。那么你知道Linux防火墙怎么开放端口么?接下来是小编为大家收集的Linux防火墙开放端口,欢迎大家阅读:Linux防火墙开放端口serviceiptablesstatus查看防火墙状态serviceiptablesstart开启防火墙serviceiptablesstop关闭防火墙serviceiptablesres…

    2022年9月15日
    0
  • 可执行文件的组成

    可执行文件的组成在ADS下,可执行文件有两种,一种是.axf文件,带有调试信息,可供AXD调试工具使用.另一种是.bin文件,可执行的二进制代码文件。我们重点是讲描.bin文件的组成。我们把可执行文件

    2022年8月2日
    4
  • 谷尼GoonieFilter网站内容敏感词过滤系统[通俗易懂]

    谷尼GoonieFilter网站内容敏感词过滤系统[通俗易懂] GoonieFilter网站内容敏感词过滤系统 GoonieFilter网站内容敏感词过滤系统是一套基于多智能主体技术的网站内容敏感词过滤系统,引入了多个主体来实现敏感信息过滤功能,通过多主体的协作,可以有效的对网站敏感信息的采集、处理和监控,以计算机智能处理技术辅助信息汇集整理和分析,最后去伪存真,实现网站敏感信息过滤。GoonieFilter敏感词过滤系统适用于网站新闻、博客…

    2022年6月4日
    28
  • 喊山第二部_demjanov重排

    喊山第二部_demjanov重排原题链接喊山,是人双手围在嘴边成喇叭状,对着远方高山发出“喂—喂喂—喂喂喂……”的呼唤。呼唤声通过空气的传递,回荡于深谷之间,传送到人们耳中,发出约定俗成的“讯号”,达到声讯传递交流的目的。原来它是彝族先民用来求援呼救的“讯号”,慢慢地人们在生活实践中发现了它的实用价值,便把它作为一种交流工具世代传袭使用。(图文摘自:http://news.xrxxw.com/newsshow-8018.html)一个山头呼喊的声音可以被临近的山头同时听到。题目假设每个山头最多有两个能听到它的临近山头。给定任意一个发

    2022年8月8日
    4

发表回复

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

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