并发编程之知识梳理 第二部分

你好! 这是我对于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并发编程之美》翟陆续,薛宾田