侧边栏壁纸
博主头像
孔子说JAVA博主等级

成功只是一只沦落在鸡窝里的鹰,成功永远属于自信且有毅力的人!

  • 累计撰写 292 篇文章
  • 累计创建 132 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

Java并发编程之Executor与Fork-join框架实战教程

孔子说JAVA
2022-07-01 / 0 评论 / 0 点赞 / 61 阅读 / 1,985 字 / 正在检测是否收录...

JDK1.5之前,对于多线程编程的支持还是比较原始的,只能通过继承 Thread类 或实现 Runnable接口 来编写多线程逻辑,功能也并不多。而JDK1.5的JUC包中,对Java的多线程应用做了一次全面的扩展,比如lock锁、并发容器等,还有一个重要的扩展就是出现了Executor执行框架。Executor执行框架将Java线程的应用做了更细致的功能划分,并且进行了功能的增强。Fork-join框架允许在几个工作进程中断某个任务,然后等待结果组合它们。在很大程度上利用了多处理器机器的生产能力。

image-1655254701652

1、Executor框架概述

Executor执行框架对Java线程进行了功能的增强,我们只需创建线程任务、然后交给指定的线程池去执行,执行完毕之后等待获取返回结果即可,不再需要关注线程的创建、开启、执行、回收等基础性的中间工作,将任务与线程解耦,程序员可以更加的关注和业务相关的线程任务逻辑。

  • Executor框架的最大优点是把任务的提交和执行解耦。要执行任务的人只需把Task描述清楚,然后提交即可。这个Task是怎么被执行的,被谁执行的,什么时候执行的,提交的人就不用关心了。具体点讲,提交一个Callable对象给ExecutorService(如最常用的线程池ThreadPoolExecutor),将得到一个Future对象,调用Future对象的get方法等待执行结果就好了。

具体教程Java并发编程之异步执行器Executor框架概述

2、ThreadPoolExecutor线程池

线程池(Thread pool)是一种线程使用模式,在其内维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络 sockets 等的数量。ThreadPoolExecutor线程池是JDK线程池的关键实现,是线程池的核心类,Executors静态工厂中的预定义线程池很多都是以这个类为基础实现的。

具体教程1java并发编程之ThreadPoolExecutor线程池详解及实战一
具体教程2java并发编程之ThreadPoolExecutor线程池详解及实战二

3、Executors线程池工厂

从Java5开始对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一。Executor框架作为一个灵活且强大的异步执行框架,支持多种不同类型的任务执行策略,提供了一种标准的方法将任务的提交过程和执行过程进行了解耦,基于生产者和消费者模型,还提供了对生命周期的支持,以及统计信息收集,应用程序管理机制和性能检测等机制。

  • Executors可以看作一个工具类,其实就是一个简单工厂,它的所有方法都是static的(静态方法),用户可以根据需要,选择需要创建的执行器实例,即内置线程池。Executors一共提供了六类可供创建的Executor执行器实例。

具体教程Java并发编程之Executors线程池工厂详解实战

4、Callable和Future

在Java中,创建线程有三种方式,一是继承Thread类,二是实现Runnable接口,三是使用Callable及Future接口。前两种方式的缺点是在线程任务执行结束后,无法获取执行结果。一般只能采用共享变量或共享存储区以及线程通信的方式实现获得任务结果的目的(不推荐)。第3种方式是Java1.5开始提供的,Callable和Future结合使用使线程具有返回值的功能,其中Callable用来执行任务,产生结果,而Future用来获得结果。

具体教程Java并发编程之Callable和Future详解实战

5、ForkJoinPool与newWorkStealingPool

从Java 7开始引入了一种新的线程池 ForkJoinPool。和 ThreadPoolExecutor 一样,也实现了 Executor 和 ExecutorService 接口。优势在于可以充分利用多核cpu的优势,把一个任务拆分成多个“小任务”分发到不同的cpu核心上执行,执行完后再把结果收集到一起返回。典型的应用比如快速排序算法。这里的要点在于,ForkJoinPool需要使用相对少的线程来处理大量的任务。

  • ForkJoinPool 使用分治法(Divide-and-Conquer Algorithm) 思想来解决问题,它使用了一个无限队列来保存需要执行的任务,而线程的数量则是通过构造函数传入,如果没有向构造函数中传入希望的线程数量,就会以当前计算机可用的CPU数量作为线程数量的默认值。

具体教程Java并发编程之ForkJoinPool及newWorkStealingPool线程池

0

评论区