当前位置: 首页 > news >正文

面试专题:java多线程(2)-- 线程池

1.为什么要用线程池?
线程池提供了一种限制和管理资源(包括执行一个任务)。   每个线程池还维护一些基本统计信息,例如已完成任务的数量。
这里借用《Java并发编程的艺术》提到的来说一下使用线程池的好处:
降低资源消耗。 通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。 当任务到达时,任务可以不需要的等到线程创建就能立即执行。
提高线程的可管理性。 线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性, 使用线程池可以进行统一的分配,调优和监控。

2.实现Runnable接口和Callable接口的区别
如果想让线程池执行任务的话需要实现的Runnable接口或Callable接口。 Runnable接口或Callable接口实现类都可以被ThreadPoolExecutor或ScheduledThreadPoolExecutor执行。两者的区别在于    Runnable    接口不会返回结果但是 Callable 接口可以返回结果。
备注: 工具类Executors 可以实现Runnable 对象和Callable 对象之间的相互转换。
( Executors.callable(Runnable task) 或Executors.callable(Runnable task,Object resule) )。

3执行execute()方法和submit()方法的区别是什么呢?
1)execute() 方法用于提交不需要返回值的任务,所以无法判断任务是否被线程池执行成功与否;

2)submit()方法用于提交需要返回值的任务。线程池会返回一个future类型的对象,通过这个future对象可以判断任务是否执行成功,并且可以通过future的get()方法来获取返回值,get()方法会阻塞当前线程直到任务完成,而使用get(long timeout,TimeUnit unit) 方法则会阻塞当前线程一段时间后立即返回,这时候有可能任务没有执行完。

4如何创建线程池
《阿里巴巴Java开发手册》中强制线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险:

Executors 返回线程池对象的弊端如下:
FixedThreadPool 和 SingleThreadExecutor : 允许请求的队列长度为 Integer.MAX_VALUE,可能堆积大量的请求,从而导致OOM。
CachedThreadPool 和 ScheduledThreadPool : 允许创建的线程数量为 Integer.MAX_VALUE ,可能会创建大量线程,从而导致OOM。Executors 返回线程池对象的弊端如下:
FixedThreadPool 和 SingleThreadExecutor : 允许请求的队列长度为 Integer.MAX_VALUE,可能堆积大量的请求,从而导致OOM。

方式一:通过构造方法实现

方式二:通过Executor 框架的工具类Executors来实现 我们可以创建三种类型的ThreadPoolExecutor

FixedThreadPool  :  该方法返回一个固定线程数量的线程池。该线程池中的线程数量始终不变。当有一个新的任务提交时,线程池中若有空闲线程,则立即执行。若没有,则新的任务会被暂存在一个任务队列中,待有线    程空闲时,便处理在任务队列中的任务。

SingleThreadExecutor:    方法返回一个只有一个线程的线程池。若多余一个任务被提交到该线程池,任务会被保存在一个任务队列中,待线程空闲,按先入先出的顺序执行队列中的任务。

CachedThreadPool:    该方法返回一个可根据实际情况调整线程数量的线程池。线程池的线程数量不确定,但若有空闲线程可以复用,则会优先使用可复用的线程。若所有线程均在工作,又有新的任务提交,则会创建新   的线程处理任务。所有线程在当前任务执行完毕后,将返回线程池进行复用。

对应Executors工具类中的方法如图所示

http://www.lryc.cn/news/91756.html

相关文章:

  • Linux文件权限及用户管理
  • 以AI为灯,照亮医疗放射防护监管盲区
  • Golang单元测试详解(一):单元测试的基本使用方法
  • 数据库的序列
  • 2022年回顾
  • 40亿个QQ号,限制1G内存,如何去重?
  • 【django】django的orm的分组查询
  • MySQL5.8在Windows下下载+安装+配置教程
  • Flask or FastAPI? Python服务端初体验
  • 《计算机组成原理》唐朔飞 第7章 指令系统 - 学习笔记
  • Linux:apache网页优化
  • 涨点技巧:注意力机制---Yolov8引入Resnet_CBAM,CBAM升级版
  • solr教程
  • 基于java语言编写的爬虫程序
  • UM2082F08 125k三通道低频无线唤醒ASK接收功能的SOC芯片 汽车PKE钥匙
  • 【SpringBoot_Project_Actual combat】 Summary of Project experience_需要考虑的问题
  • 恒容容器放气的瞬时流量的计算与合金氢化物放氢流量曲线的计算
  • 网络编程_UDP通信
  • windows修改Pycharm的右键打开方式
  • Python入门(十四)函数(二)
  • Allure测试报告定制全攻略,优化你的Web自动化测试框架!
  • 推荐系统算法详解
  • 企业网站架构部署与优化之LAMP
  • 攻防世界安卓逆向练习
  • 自然语言处理从入门到应用——自然语言处理的语言模型(Language Model,LM)
  • 【MySql】InnoDB一棵B+树可以存放多少行数据?
  • 【综述】视频无监督域自适应(VUDA)的小综述
  • 《深入理解计算机系统(CSAPP)》第9章虚拟内存 - 学习笔记
  • 信息论与编码 SCUEC DDDD 期末复习
  • windows安装python开发环境