ExecutorService,Executors 使用
JAVA 5之后,使用线程时,都离不开ExecutorService,这是一个借口,他继承了Executor接口。
这是API描述:
Executor
提供了管理终止的方法,以及可为跟踪一个或多个异步任务执行状况而生成 Future
的方法。
可以关闭 ExecutorService,这将导致其拒绝新任务。提供两个方法来关闭 ExecutorService。shutdown()
方法在终止前允许执行以前提交的任务,而 shutdownNow()
方法阻止等待任务启动并试图停止当前正在执行的任务。在终止时,执行程序没有任务在执行,也没有任务在等待执行,并且无法提交新任务。应该关闭未使用的 ExecutorService 以允许回收其资源。
通过创建并返回一个可用于取消执行和/或等待完成的 Future
,方法 submit 扩展了基本方法 Executor.execute(java.lang.Runnable)
。方法 invokeAny 和 invokeAll 是批量执行的最常用形式,它们执行任务 collection,然后等待至少一个,或全部任务完成(可使用 ExecutorCompletionService
类来编写这些方法的自定义变体)。
Executors
类提供了用于此包中所提供的执行程序服务的工厂方法。
ExecutorService 建立多线程的步骤:
1。定义线程类 |
class Handler implements Runnable{ } |
2。建立ExecutorService线程池 |
ExecutorService executorService = Executors.newCachedThreadPool(); 或者 |
3。调用线程池操作 |
循环操作,成为daemon,把新实例放入Executor池中 while(true){ |
几种不同的ExecutorService线程池对象
1.newCachedThreadPool() |
-缓存型池子,先查看池中有没有以前建立的线程,如果有,就reuse.如果没有,就建一个新的线程加入池中 -缓存型池子通常用于执行一些生存期很短的异步型任务 因此在一些面向连接的daemon型SERVER中用得不多。 -能reuse的线程,必须是timeout IDLE内的池中线程,缺省timeout是60s ,超过这个IDLE时长,线程实例将被终止及移出池。 注意,放入CachedThreadPool的线程不必担心其结束,超过TIMEOUT不活动,其会自动被终止。 |
2. newFixedThreadPool |
-newFixedThreadPool与cacheThreadPool差不多,也是能reuse就用,但不能随时建新的线程 -其独特之处:任意时间点,最多只能有固定数目的活动线程存在,此时如果有新的线程要建立,只能放在另外的队列中等待 ,直到当前的线程中某个线程终止直接被移出池子 |
3.ScheduledThreadPool |
-调度型线程池 -这个池子里的线程可以按schedule依次delay执行,或周期执行 |
4.SingleThreadExecutor |
-单例线程,任意时间池中只能有一个线程 -用的是和cache池和fixed池相同的底层池,但线程数目是1-1,0秒IDLE(无IDLE) |
上面四种线程池,都使用Executor的缺省线程工厂建立线程,也可单独定义自己的线程工厂
下面是缺省线程工厂代码:
static class DefaultThreadFactory implements ThreadFactory { static final AtomicInteger poolNumber = new AtomicInteger(1); final ThreadGroup group; final AtomicInteger threadNumber = new AtomicInteger(1); final String namePrefix; DefaultThreadFactory() { namePrefix = "pool-" + poolNumber.getAndIncrement() + "-thread-"; public Thread newThread(Runnable r) { |
也可自己定义ThreadFactory,加入建立池的参数中
public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory ) { |
Executor的execute()方法
execute() 方法将Runnable实例加入pool中,并进行一些pool size计算和优先级处理
execute() 方法本身在Executor接口中定义,有多个实现类都定义了不同的execute()方法
如ThreadPoolExecutor类(cache,fiexed,single三种池子都是调用它)的execute方法如下:
public void execute(Runnable command) { if (command == null) throw new NullPointerException(); if (poolSize >= corePoolSize || !addIfUnderCorePoolSize(command)) { if (runState == RUNNING && workQueue.offer(command)) { if (runState != RUNNING || poolSize == 0) ensureQueuedTaskHandled(command); } else if (!addIfUnderMaximumPoolSize(command)) reject(command); // is shutdown or saturated } } |
ExecutorService,Executors 使用相关推荐
- Java并发编程 - Executor,Executors,ExecutorService, CompletionServie,Future,Callable
一.Exectuor框架简介 Java从1.5版本开始,为简化多线程并发编程,引入全新的并发编程包:java.util.concurrent及其并发编程框架(Executor框架). Executor ...
- java并发编程:Executor、Executors、ExecutorService
Executors 在Java 5之后,并发编程引入了一堆新的启动.调度和管理线程的API.Executor框架便是Java 5中引入的,其内部使用了线程池机制,它在java.util.coc ...
- ExecutorService 的理解与使用
接口 Java.util.concurrent.ExecutorService 表述了异步执行的机制,并且可以让任务在后台执行.壹個 ExecutorService 实例因此特别像壹個线程池.事实上, ...
- ExecutorService线程池
ExecutorService 建立多线程的步骤: 1.定义线程类 class Handler implements Runnable{ } 2.建立ExecutorService线程池 Execut ...
- Java多线程系列七——ExecutorService
java.util.concurrent.ExecutorService接口提供了许多线程管理的方法 Method 说明 shutdown 拒绝接收新的任务,待已提交的任务执行后关闭,且宿主线程不阻塞 ...
- 浅析Java线程池 ExecutorService
ExecutorService是Java中对线程池定义的一个接口,它java.util.concurrent包中. 创建一个什么样的ExecutorService的实例(即线程池)需要g根据具体应用场 ...
- java JUC线程池:Executors.newSingleThreadExecutor代码示例
package com.zxl.juc;import java.util.concurrent.ExecutorService; import java.util.concurrent.Executo ...
- java并发中ExecutorService的使用
文章目录 创建ExecutorService 为ExecutorService分配Tasks 关闭ExecutorService Future ScheduledExecutorService Exe ...
- Java ExecutorService 线程池
//==采用Java 5的ExecutorService来进行线程池的方式实现多线程,模拟客户端多用户向同一服务器端发送请求. //==服务器端: import java.io.BufferedRea ...
最新文章
- 2022-2028年中国边缘计算行业投资分析及前景预测报告(全卷)
- Metasploit search命令使用技巧
- Eclipse使用Maven时出现:Index downloads are disabled, search results may be incomplete.问题解决...
- C程序背后的故事--头文件、库文件的查找
- eclipse 配置黑色主题
- FreeRtos 内核函数 cmsis_os函数一览
- 智能电视系列(4)-高通,天才与极限
- 如何避免JS内存泄漏?
- 微信几亿人在线的点赞、取消点赞系统,用Redis如何实现?
- MVC3.0图片滚动和相册展示(下)
- Java学习笔记-枚举类
- 如何更高效地学习3D视觉?
- 数据恢复技巧:U盘文件被隐藏怎么恢复?
- 等保测评机构是什么意思?是什么性质的单位?
- 根据书单来制作item2vec
- 测试ios软件开发,iOS开发中的测试框架
- 买手妈妈如何赚钱?赚钱的模式具体是什么?
- springmvc中ajax请求406错误响应码
- Mixly 数码管时钟
- 根据两个经纬度点计算距离