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

java多线程——线程池

线程池

  • 线程池
  • 创建线程池
  • 关闭线程池
  • 使用
  • 获取多个结果

线程池

一个线程池中存在许多准备运行的空闲线程,把Runnable对象交给线程池,会有一个线程调用其run()方法,当调用完后线程不会死亡,而是在池中继续为下一次请求服务

利用线程池可避免创建大量生命周期很短的线程,同时也可限制并发线程的数目

创建线程池

创建方法备注
Executors.newCachedThreadPool()若线程池无可用空闲线程,则创建一个,空闲线程保留60秒
Executors.newFixedThreadPool(int)构建固定大小的线程池,空闲线程会一直保留
若任务数>线程数,其余的任务置于队列中
Executors.newSingleThreadExecutor()大小为1的线程池,按顺序执行任务
Executors.newScheduledThreadPool(int)创建预定执行的线程池

上面方法都返回实现了ExecutorService接口的ThreadPoolExecutor类,可用下面的方法将Runnable或Callable传给ExecutorService

创建方法备注
Future<?> submit(Runnable task)get()方法完成后返回null
Future<T> submit(Runnable task, T result)get()方法完成后返回result
Future<?> submit(Callable task)计算好后才返回Future对象

关闭线程池

  • shundown,关闭后不再接受新的任务,当内部的任务都完成后,池中的线程死亡
  • shundownNow,取消尚未开始的所有任务并试图中断正在运行的线程

使用

若要获取到结果,可通过submit()方法返回future

ExecutorService executorService = Executors.newCachedThreadPool();
executorService.submit(new Runnable() {@Overridepublic void run() {}
});
executorService.shutdown();

获取多个结果

  • ExecutorService.invokeAny()提交一个Callable的集合,并返回某个已完成任务的Future,但不能确定是哪个任务
  • ExecutorService.invokeAll()提交一个Callable的集合,并返回所有任务的Future集合,但当一个任务耗时过长时,其他任务也得等待
  • new ExecutorCompletionService<>(Executors.newCachedThreadPool())构建ExecutorCompletionService管理future对象的阻塞队列,其包含了完成任务的执行结果
http://www.lryc.cn/news/160530.html

相关文章:

  • Linux文件操作
  • Tomcat多实例 + Tomcat负载均衡、动静分离(Nginx联动)
  • bootstrap和application的区别
  • 【狂神】SpringMVC笔记(一)之详细版
  • vue 对axios进行封装
  • 第十二章 YOLO的部署实战篇(下篇-cuda)
  • 原生JavaScript+PHP多图上传实现
  • 企业架构LNMP学习笔记30
  • 数学建模算法汇总(全网最全,含matlab案例代码)
  • openpnp - 底部相机高级矫正后,底部相机看不清吸嘴的解决方法
  • 怎么提高自己当众讲话的能力?
  • 孙哥Spring源码第20集
  • 【计算机网络】HTTP(上)
  • Maven学习记录
  • H5游戏开发H5休闲小游戏定制H5软件定制
  • Spring基础及IoC容器的理解
  • 护网行动为什么给的钱那么多
  • 软考知识汇总-计算机系统
  • OpenCV 11(图像金字塔)
  • Linux学习笔记-Ubuntu系统用户、群组、权限管理
  • 文章预览 安防监控/视频存储/视频汇聚平台EasyCVR播放优化小tips
  • Nand Flash的特性及烧录问题
  • 【React 】useLayoutEffect 和 useEffect的区别
  • oracle数据库常见的优化步骤与脚本
  • 并发内存池(C++)
  • 本地起一个VUE 前端项目
  • Python爬虫:Selenium的介绍及简单示例
  • 每日刷题|回溯法解决全排列问题第二弹之解决字符串、字母大小排列问题
  • python循环遍历字典: title_content_list.append([key, value])print(ti
  • Redis List类型命令 - Set类型命令 - SortedSet类型命令