天天看点

并发编程之知识梳理 第二部分全文内容引用

Java 并发包

  • 全文内容
    • 线程池
      • 好处
      • 实现原理
        • 线程池的主要处理流程
        • ThreadPoolExecutor执行示意图
      • 使用
        • 创建
        • 向线程池提交任务
        • 关闭
        • 合理地配置线程池
        • 线程池的监控
      • Executor
        • 框架简介
          • 两级调度模型
          • 结构
            • 类与接口
            • 使用示意图
          • 成员
        • ThreadPoolExecutor
        • ScheduleThreadPoolExecutor
        • FutureTask
    • 容器和框架
      • ConcurrentHashMap
      • ConcurrentLinkedQueue
      • Java中的阻塞队列
      • Fork/Join框架
        • 是什么?
        • 工作窃取算法
        • 异常处理
    • 并发工具类
      • CountDownLatch
        • 重要方法:
        • 为什么不使用ReentrantLock?
      • Semaphore
      • CyclicBarrier
        • 重要方法:
      • Phaser
      • Exchanger
    • 原子操作类
  • 引用

你好! 这是我对于Java 并发编程相关知识点的梳理与思考,希望对你能有所帮助;菜鸟萌新,问题多多,欢迎指出,谢谢!(全文链接: 点击在线查看清晰思维导图.)

本文章以图为主,如果文章中没有图片,麻烦移步: 链接.

全文内容

并发编程之知识梳理 第二部分全文内容引用

线程池

好处

并发编程之知识梳理 第二部分全文内容引用

实现原理

线程池的主要处理流程

并发编程之知识梳理 第二部分全文内容引用

ThreadPoolExecutor执行示意图

并发编程之知识梳理 第二部分全文内容引用

使用

创建

并发编程之知识梳理 第二部分全文内容引用

向线程池提交任务

并发编程之知识梳理 第二部分全文内容引用

关闭

并发编程之知识梳理 第二部分全文内容引用

合理地配置线程池

并发编程之知识梳理 第二部分全文内容引用

线程池的监控

并发编程之知识梳理 第二部分全文内容引用

Executor

框架简介

两级调度模型
并发编程之知识梳理 第二部分全文内容引用
结构
并发编程之知识梳理 第二部分全文内容引用

类与接口

并发编程之知识梳理 第二部分全文内容引用
并发编程之知识梳理 第二部分全文内容引用

使用示意图

并发编程之知识梳理 第二部分全文内容引用
并发编程之知识梳理 第二部分全文内容引用
成员
并发编程之知识梳理 第二部分全文内容引用

ThreadPoolExecutor

并发编程之知识梳理 第二部分全文内容引用
并发编程之知识梳理 第二部分全文内容引用
并发编程之知识梳理 第二部分全文内容引用

ThreadPoolExecutor执行任务示意图:

并发编程之知识梳理 第二部分全文内容引用

CachedThreadPool的execute()的运行示意

并发编程之知识梳理 第二部分全文内容引用
并发编程之知识梳理 第二部分全文内容引用

CachedThreadPool的任务传递示意图:

并发编程之知识梳理 第二部分全文内容引用

ScheduleThreadPoolExecutor

ScheduledThreadPoolExecutor的任务传递示意图:

并发编程之知识梳理 第二部分全文内容引用
并发编程之知识梳理 第二部分全文内容引用

ScheduledThreadPoolExecutor的任务执行步骤:

并发编程之知识梳理 第二部分全文内容引用
并发编程之知识梳理 第二部分全文内容引用
并发编程之知识梳理 第二部分全文内容引用
并发编程之知识梳理 第二部分全文内容引用

FutureTask

并发编程之知识梳理 第二部分全文内容引用
并发编程之知识梳理 第二部分全文内容引用

FutureTask的设计示意图:

并发编程之知识梳理 第二部分全文内容引用

FutureTask的级联唤醒示意图:

并发编程之知识梳理 第二部分全文内容引用
并发编程之知识梳理 第二部分全文内容引用
并发编程之知识梳理 第二部分全文内容引用

容器和框架

ConcurrentHashMap

并发编程之知识梳理 第二部分全文内容引用
并发编程之知识梳理 第二部分全文内容引用
并发编程之知识梳理 第二部分全文内容引用

ConcurrentLinkedQueue

Java中的阻塞队列

并发编程之知识梳理 第二部分全文内容引用

Fork/Join框架

是什么?

并发编程之知识梳理 第二部分全文内容引用

工作窃取算法

并发编程之知识梳理 第二部分全文内容引用

异常处理

并发编程之知识梳理 第二部分全文内容引用

并发工具类

并发编程之知识梳理 第二部分全文内容引用

CountDownLatch

在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。

  • 基于AbstractQueuedSynchronizer实现,state初始化为count,每countDown一次减1直到等于0,
  • unpark唤醒await线程

重要方法:

  • await():调用此方法线程会被阻塞,直到count为0
  • await(long timeout, TimeUnit unit):同await(),可以设置最大等待时间,如超过最大等待时间,则不再等待
  • countDown():count减1,直至为0

为什么不使用ReentrantLock?

countDown不需要堵塞,只需要在最后一次count=0时去唤醒堵塞的主线程(await),AQS+LockSupport完全够用。

Semaphore

  • 计数信号量,用于控制特定资源在同一个时间被访问的个数
  • 基于AbstractQueuedSynchronizer实现,支持公平和非公平信号量,默认非公平信号量,state初始化为permits。

CyclicBarrier

  • 一个可循环使用(Cyclic)的屏障(Barrier),让一组线程到达一个屏障(同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会放行,所有被屏障拦截的线程继续执行。
  • 基于ReentrantLock+Condition实现,await后先lock,然后–count,不等于0就执行Condition.await。反之,重置count并执行Condition.signalAll唤醒所有堵塞线程。

重要方法:

  • await():在CyclicBarrier上进行阻塞等待,并使count减1
  • await(long timeout, TimeUnit unit):在CyclicBarrier上进行限时的阻塞等待,并使count减1,当时间到达限定时间后,线程继续执行
  • getParties():获取CyclicBarrier通过屏障的线程数量,也称为方数
  • getNumberWaiting():获取正在CyclicBarrier上等待的线程数量

Phaser

Exchanger

原子操作类

并发编程之知识梳理 第二部分全文内容引用

引用

[1]: 链接: https://mp.weixin.qq.com/s/-PRq4ChaCkEFB_DJyyKhvg

[2]: 《Java并发编程的艺术》 方腾飞 魏鹏 程晓明

[3]: 《Java并发编程之美》翟陆续,薛宾田