资讯专栏INFORMATION COLUMN

初读《Java并发编程的艺术》-第十章:Executor框架 -10.1 Executor框架简介

aisuhua / 2386人阅读

摘要:线程的启动与销毁都与本地线程同步。操作系统会调度所有线程并将它们分配给可用的。框架的成员主要成员线程池接口接口接口以及工具类。创建单个线程的接口与其实现类用于表示异步计算的结果。参考书籍并发编程的艺术方腾飞魏鹏程晓明著

在java中,直接使用线程来异步的执行任务,线程的每次创建与销毁需要一定的计算机资源开销。每个任务创建一个线程的话,当任务数量多的时候,则对应的创建销毁开销会消耗大量的资源,这种策略最终可能会使处于高负荷状态的应用崩溃。

Java中的线程,即使工作单元,也是执行机制。从JDK5开始,把工作单元与执行机制分离开来。

工作单元:Runnable 和 Callable

执行机制:Executor 框架

1. Executor 框架简介 1.1 Executor 框架的两级调度模型

在HotSpot VM 的线程模型中,Java线程(java.lang.Thread) 被一对一的映射为本地操作系统的线程。Java线程的启动与销毁都与本地线程同步。操作系统会调度所有线程并将它们分配给可用的CPU。

在上层,Java使用多线程的程序,通常会将应用分解为若干任务,然后使用用户级别的调度器(Executor框架)将这些任务映射为对应数量的线程;

底层,操作系统会将这些线程映射到硬件处理器上,切下层硬件的调度并不受应用程序的控制。调度模型如下图

1.2 Executor框架的结构与成员 1. Excutor 框架的结构 -主要由3大部分组成

任务

Runnable接口(无返回值)

Callable接口(有返回值)

任务的执行
执行机制的核心接口-Executor,以及实现Executor接口的ExecutorService,
Executor框架 中有两个关键类实现了ExecutorService:

ThreadPoolExecutor

线程池的实现类,执行被提交的线程、任务(Callable/Runnable 接口的实现类中的run()方法)

ScheduledThreadPoolExecutor

给定延迟或定期的执行任务(Callable/Runnable 接口的实现类中的run()方法)、命令。比Timer 更加灵活,强大。

异步执行的结果(返回值)

Future 接口 可以通过get()方法或者异步执行的结果

FutureTask类 (实现了Future接口)

Executor框架的使用:

主线程(main线程)创建实现Runnable或者Callable 接口的待执行任务对象。

Executors可以将Runnable封装为Callable {Executors.callable(Runnable task)/(Runnable task,result)}。

Runnable接口对象可以交由ExexutorService执行 {ExecutorService.executor(Runnable r) {无返回值};或者把Runnable接口对象或Callable接口对象交由ExecutorService执行 {ExecutorService.submit(Runnable r/Callable t) 有返回值 Futrue接口的对象,现阶段JDK返回的是FutureTask};

最后,主线程(main线程)执行 FutrueTask.get()阻塞,等待任务执行完成,同时获取返回值。也可以执行FutureTask.cancel(boolean mayInterruptIfRunning)取消执行(参数表示如果正在执行是否取消)。

2. Executor框架的成员
主要成员: ThreadPoolExecutor(线程池)、ScheduldThreadPoolExecutor、Runnable接口、Future接口、Callable接口 以及 Executors工具类。

ThreadPoolExecutor
通常使用Executors 创建,Executors可以创建三种类型的ThreadPoolExecutor:SingleThreadExecuto、FixedThreadPool、CachedThreadPool

FixedThreadPool 创建固定线程数,适用于限制当前线程数量时,适用于负载较重的服务器。
Executor创建使用的API:

public static ExecutorService newFixedThreadPool(int nThreads);
public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory);

SingleThreadExecutor 创建单个线程,任意时间点不会有多个线程是活动的,适用于需要保证顺序执行各任务的时候。
Executors创建API:

public static ExecutorService newSingleThreadPool();
public static ExecutorService newSingleThreadPool(ThreadFactory threadFactory);

CachedThreadPool 根据需要创建新线程,大小无界的线程池,适用于执行大量短期的异步任务时,或负载较轻的服务器。
Executors创建API:

public static ExecutorService newCachedThreadPool();
public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory);

ScheduledThreadPoolExecutor
使用Executors工厂类创建,Executors可以创建两种类型的ScheduldThreadPoolExecutor

ScheduledThreadPoolExecutor 包含若干个线程,适用于多个线程执行周期任务,同时限制执行的线程数量。
Executors 创建固定个数线程ScheduledThreadPoolExecutor 的API:

public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize);
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory);

SingleThreadScheduledExecutor 之包含一个线程,适用于单个后台线程执行定时任务,同时保证顺序执行各个任务。
Executors 创建单个线程SingleScheduledExecutor 的API:

public static ScheduledExecutorService newSingleScheduledExecutor(int corePoolSize);
public static ScheduledExecutorService newSingleScheduledExecutor(int corePoolSize, ThreadFactory threadFactory);

Future 接口
与其实现类FutureTask用于表示异步计算的结果。Runnable/Callable接口提交(submit)给ThreadPoolExecutor或者ScheduledThreadPoolExecutor时候,返回值为FutureTask对象、实现类Future接口的对象。

 Future submit(Callable task);
 Future submit(Runnable task, T result);
Future submit(Runnable task);

Runnable 和Callable 接口
都可以被线程池执行,Runnable 无返回值,Callable 有返回值。
Runnable可以使用工厂类Executors将其封装为Callble
Executors 对应API如下:

//将返回的Callable对象提交给线程池返回FutureTask对象,调用FutureTask.get(),返回null
public static Callable callable(Runnable task);

//同上提交,FutureTask.get(),返回result对象。
public static Callable callable(Runnable task, T result);
    

参考书籍

《Java并发编程的艺术》 -方腾飞 魏鹏 程晓明 著

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/74446.html

相关文章

  • Java多线程学习(八)线程池与Executor 框架

    摘要:一使用线程池的好处线程池提供了一种限制和管理资源包括执行一个任务。每个线程池还维护一些基本统计信息,例如已完成任务的数量。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。使用无界队列作为线程池的工作队列会对线程池带来的影响与相同。 历史优质文章推荐: Java并发编程指南专栏 分布式系统的经典基础理论 可能是最漂亮的Spring事务管理详解 面试中关于Java虚拟机(jvm)的问...

    cheng10 评论0 收藏0
  • Java并发

    摘要:对象改变条件对象当前线程要等待线程终止之后才能从返回。如果线程在上的操作中被中断,通道会被关闭,线程的中断状态会被设置,并得到一个。清除线程的中断状态。非公平性锁虽然可能造成饥饿,但极少的线程切换,保证其更大的吞吐量。 声明:Java并发的内容是自己阅读《Java并发编程实战》和《Java并发编程的艺术》整理来的。 showImg(https://segmentfault.com/im...

    SKYZACK 评论0 收藏0
  • java并发系列 - 19天:JUC中Executor框架详解1,全面掌握java并发相关技术

    摘要:有三种状态运行关闭终止。类类,提供了一系列工厂方法用于创建线程池,返回的线程池都实现了接口。线程池的大小一旦达到最大值就会保持不变,在提交新任务,任务将会进入等待队列中等待。此线程池支持定时以及周期性执行任务的需求。 这是java高并发系列第19篇文章。 本文主要内容 介绍Executor框架相关内容 介绍Executor 介绍ExecutorService 介绍线程池ThreadP...

    icattlecoder 评论0 收藏0
  • ForkJoin框架之CompletableFuture

    摘要:内部类,用于对和异常进行包装,从而保证对进行只有一次成功。是取消异常,转换后抛出。判断是否使用的线程池,在中持有该线程池的引用。 前言 近期作者对响应式编程越发感兴趣,在内部分享JAVA9-12新特性过程中,有两处特性让作者深感兴趣:1.JAVA9中的JEP266对并发编程工具的更新,包含发布订阅框架Flow和CompletableFuture加强,其中发布订阅框架以java.base...

    lindroid 评论0 收藏0
  • java并发系列 - 20天:JUC中Executor框架详解2

    摘要:示例执行一批任务,然后消费执行结果代码如下跟着阿里学并发,微信公众号输出代码中传入了一批任务进行处理,最终将所有处理完成的按任务完成的先后顺序传递给进行消费了。 这是java高并发系列第20篇文章。 本文内容 ExecutorCompletionService出现的背景 介绍CompletionService接口及常用的方法 介绍ExecutorCompletionService类及...

    msup 评论0 收藏0
  • 原理剖析( 010 篇)Netty之服务端启动工作原理分析(上)

    摘要:端引导类线程管理组线程管理组将设置到服务端引导类中指定通道类型为,一种异步模式,阻塞模式为设置让服务器监听某个端口已等待客户端连接。 原理剖析(第 010 篇)Netty之服务端启动工作原理分析(上) - 一、大致介绍 1、Netty这个词,对于熟悉并发的童鞋一点都不陌生,它是一个异步事件驱动型的网络通信框架; 2、使用Netty不需要我们关注过多NIO的API操作,简简单单的使用即可...

    coordinate35 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<