Java并发Executor框架
作者:网络转载 发布时间:[ 2016/4/25 11:18:54 ] 推荐标签:测试开发技术 编程语言
1、Executor框架简介
从JDK5开始,工作单元和执行机制隔离开来,工作单元包括Runnable和Callable,执行机制由Executor提供。
调用关系:Java线程一对一映射到本地操作系统的系统线程,当多线程程序分解若干任务,使用用户级的调度器(Executor框架)将任务映射为固定数量的线程,底层,操作系统吧、内核将这些线程映射到硬件处理器上。
2、EXecutor结构成员
Executor是一个接口,它将任务的提交与任务的执行分离开来。
ThreadPoolExecutor是线程池的核心实现类,执行被提交的任务
ScheduledThreadPoolExecutor是一个实现类,在给定的延迟后运行或定期执行命令
Future接口和实现Future接口的FutureTask类,代表异步计算的结果
Runable接口和Callable接口的实现类,可以被ThreadPoolExecutor或ScheduledThreadPoolExecutor执行
2.1 使用流程
(1)创建任务对象
创建实现Runnable接口或Callable接口的任务对象。Runnable不会返回结果,Callable可以返回结果
可以使用工厂类Executors把Runnable封装成一个Callable
public static Callable<Object> callable(Runnable task)
Executors.callable(Runnable task)或Executors.callable(Runnable task,Object result)
(2)对象提交执行
把Runnable对象直接交给ExecutorService执行(ExecutorService.execute(Runnable command); ExecutorService.submit(Runnable task);ExecutorService.submit(Callable<T> task))。execute()方法用于提交不需要返回值的任务,无法判断任务是否被线程池执行成功。submit()用于提交需要返回值的任务。
(3)返回值
如果执行ExecutorService.submit(...),将返回一个实现Future接口的对象FutureTask对象,主线程可以执行FutureTask.get()方法等待任务执行完成,也可以执行FutureTask.cancel(boolean mayInterruptIfRunning)来取消任务的执行。
2.2 框架成员
ThreadPoolExecutor、ScheduledThreadPoolExecutor、Future接口、Runnable接口、Callable接口、Executors。
2.2.1 线程池介绍
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)
corePoolSize:线程池的基本大小,新任务到来时会创建一个线程来执行任务,即使其他空闲的基本线程能够执行新任务也会创建线程,当需要执行的任务数大于线程池基本大小则不创建。如果调用线程池的prestartAllCoreThread()方法,线程池会提前创建并启动所有基本线程。
maximumPoolSize:线程池大数量,线程池允许创建的大线程数,如果队列满了,并且已创建的线程数小于大线程数则创建新线程,对于无界队列该参数无效。
KeepAliveTime:线程活动保持时间,工作线程空闲后保持存活的时间,如果任务多每个任务执行时间短可以调大时间,提高线程利用率
TimeUnit:线程活动保持时间单位,可选单位,DAYS,HOURS,MINUTES,MILLISECONDS,MICROSECONDS,NANOSECONDS
BlockingQueue<Runnable>:任务队列,等待执行任务的阻塞队列,ArrayBlockingQueue:基于数组结构的有界阻塞队列,按照FIFO排序,LinkedBlockingQueue:基于链表结构的阻塞队列,按FIFO排序,吞吐量高于前者,Executors.newFixedThreadPool()使用该队列。SysnchronousQueue:一个不存储元素的阻塞队列,每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量高于前者,Executors.newCachedThreadPool()使用该队列,PriorityBlockingQueue:一个具有优先级的无线阻塞队列。
ThreadFactory:用于设置创建线程的工厂,可以通过线程工厂给每个线程设置有意义的命名,可默认设置。
RejectedExecutionHandler:饱和策略,当队列和线程池满了,必须采取一种策略处理新提交的任务。默认AbortPolicy:直接抛出异常。CallerRunsPolicy:只用调用者所在线程来运行任务;DiscardOldestPolicy:丢弃队列里近的一个任务,并执行当前任务;DiscardPolicy:不处理,丢弃掉。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11