Java并发Executor框架

发表于:2016-4-25 10:36

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:yanko_lin    来源:51Testing软件测试网采编

  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:不处理,丢弃掉。
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号