使用Executor管理Thread对象详解
java SE5的java.util.concurrent包中的执行器(Executor)是管理Thread对象的优选方法。使用Executor管理Thread对象可以简化并发编程。
Executor是在客户端和任务执行之间提供了一个间接层,与客户端直接执行任务不同,我们将使用Executor来执行任务。Executor允许你管理异步任务的执行,而无须显示地管理线程的生命周期。
线程对象知道如何运行具体的任务,它暴露了要执行的单一方法。ExecutorService(具有生命周期的Executor)知道如何构建恰当的上下文来执行runnable对象。
ExecutorService对象是使用静态的Executor方法来创建的,这个方法可以确定其Executor类型
---------------------------------------CachedThreadPool----------------------------------------
ExecutorService exec = Executors.newCachedThreadPool();
CachedThreadPool将为每个任务多创建一个线程,需要比较大的创建线程的开销。CachedThreadPool在程序中会创建与所需数量相同的线程,然后在它回收旧线程时停止创建,因此它是合理的Executor的首选。但是当这种方式会引发问题时,你就需要切换到FixedThreadPool。
--------------------------------------FixedThreadPool----------------------------------------------
ExecutorService exec = Executors.newFixedThreadPool(5);
FixedThreadPool可以一次性预先执行代价高昂的线程分配,因此也就可以控制线程的数量。这可以节省时间,因为你不用为每个任务都固定地付出创建线程的开销。在事件驱动的系统中,需要线程的事件处理器,通过直接从池中获取线程哼,也可以尽快的得到服务。因为FixedThreadPool使用的Thread对象的数量是有限且确定的,所以你不会滥用可获得的资源。
--------------------------------------SingleThreadExecutor------------------------------------------
ExecutorService exec = Executors.newSingleThreadExecutor();
SingleThreadExecutor就像是线程数量为1的FixedThreadPool。SingleThreadExecutor在你希望在另一个线程中连续运行的任何事物(长期存活的任务)来说是很有用的,例如监听进入的套接字连接的任务。同时在线程中运行的短任务也很方便,例如更新本地或远程日志的小任务或是事件分发线程。
如果向SingleThreadExecutor提交了多个任务,那么这些任务将会排队执行,每个任务都会在下个任务开始之前运行结束,所有任务都使用相同的线程,安全性会得到提高。也就是说SingleThreadExecutor会序列化所有提交给它的任务,并会维护它自己(隐藏)的悬挂任务队列。
SingleThreadExecutor可以确保任意时刻在任何线程中都只有唯一的任务在运行。在这种方法中,你不需要在共享资源上处理同步问题。通过序列化任务,你可以消除对序列化对象的需求。
---------------------------------------shutdown()--------------------------------------------------------
ExecutorService exec = Executors.newSingleThreadExecutor();exec.shutdown();
调用ExecutorService对象中的shutdown()方法可以防止新任务被提交给这个Executor,当前线程将继续运行在shutdown()被调用之前提交的所有任务。这个程序将在Executor中的所有任务完成之后尽快退出。
转载于:https://www.cnblogs.com/dyfbk/p/7092060.html
使用Executor管理Thread对象详解相关推荐
- SCOM管理包对象详解
*更多关于SCOM的详细内容,请关注我的资料* SCOM是通过管理包和代理共同完成被监视设备(被监视的设备也称之为SCOM代理)的性能和事件的收集,所以要让SCOM启动对服务器的监视,首先需要完成两个 ...
- python sqlsever 时间_Python sqlalchemy时间戳及密码管理实现代码详解
一.时间戳 实际开发中,我们一般希望create_time和update_time这两个属性能自动设置,所以在建表的时候需要在model上特殊处理一下: from sqlalchemy.sql imp ...
- ElasticSearch最全详细使用教程:入门、索引管理、映射详解、索引别名、分词器、文档管理、路由、搜索详解...
墨墨导读:之前我们分享了ElasticSearch最全详细使用教程:入门.索引管理.映射详解,本文详细介绍ElasticSearch的索引别名.分词器.文档管理.路由.搜索详解. 一.索引别名 1. ...
- ElasticSearch最全详细使用教程:入门、索引管理、映射详解
墨墨导读:本文介绍了ElasticSearch的必备知识:从入门.索引管理到映射详解. 一.快速入门 1. 查看集群的健康状况http://localhost:9200/_cat http://loc ...
- 系统批量运维管理器Fabric详解
系统批量运维管理器Fabric详解 Fabrici 是基于python现实的SSH命令行工具,简化了SSH的应用程序部署及系统管理任务,它提供了系统基础的操作组件,可以实现本地或远程shell命令,包 ...
- 【云原生之k8s】k8s管理工具kubectl详解
[云原生之k8s]k8s管理工具kubectl详解 前言 一.陈述式管理 (1)陈述式资源管理方法 (2)k8s相关信息查看 ①查看版本信息 ②查看节点信息 ③查看资源对象简写 ④查看集群信息 ⑤配置 ...
- Hibernate Criteria对象详解(条件查询)
Hibernate Criteria对象详解 2014-9-1 16:21| 发布者: 传智特刊| 查看: 7290| 评论: 0 摘要: Hibernate框架是目前JavaEE软件开发的企业主流框 ...
- elasticsearch最全详细使用教程:入门、索引管理、映射详解、索引别名、分词器、文档管理、路由、搜索详解
一.快速入门 1. 查看集群的健康状况 http://localhost:9200/_cat http://localhost:9200/_cat/health?v 说明:v是用来要求在结果中返回表头 ...
- Java Swing布局管理器(详解版)
在使用 Swing 向容器添加组件时,需要考虑组件的位置和大小.如果不使用布局管理器,则需要先在纸上画好各个组件的位置并计算组件间的距离,再向容器中添加.这样虽然能够灵活控制组件的位置,实现却非常麻烦 ...
最新文章
- 长这么大了,一件事也没做好过
- sql查询 关联帖子_MySQL的大分页查询该如何优化?
- Shiro学习(24)在线回话管理
- redmine-1.2.2安装代码评审插件
- 【每日算法Day 85】图解算法:一行代码解决约瑟夫环的变体
- leetcode(128)最长连续序列
- 搜索引擎推荐(可以代替谷歌的搜索引擎)
- ffmpeg实现摄像头拉流_ffmpeg推流及拉流
- 【图像增强】基于matlab HSI+同态滤波彩色图像增强【含Matlab源码 1515期】
- overleaf表格_LaTeX插入表格
- 【笔记本触摸板失灵】终极解决办法
- 奇怪的键盘按a截图了
- WIN 10关闭更新
- 邓白氏码申请以及企业级账号申请流程
- SPA项目开发之首页导航+左侧菜单
- FFmpeg源码分析:音频滤镜介绍(上)
- 多个搜索引擎搜索网站,提高搜索效率,快人一步
- 【群晖NAS】 利用云服务器 FRP技术 实现内网穿透
- 越狱Season 1-Episode 7: Riots, Drills and the Devil: Part 2
- java 文件删除不了File类的delete方法删不掉文件的原因分析