本文共 700 字,大约阅读时间需要 2 分钟。
Fork/Join 框架是 JDK 1.7 提供的一个用于并行执行任务的框架,其核心理念是把一个大任务分割成若干个小任务进行窃取执行,然后最终汇总每个小任务结果后得到大任务结果的并发框架。Fork 就是把一个大任务切分为若干子任务进行并行执行,Join 就是合并这些子任务的最终执行结果得到这个大任务的结果。
Fork/Join 框架采用了工作窃取(work-stealing)算法来实现,其算法核心是指某个线程从其他队列里窃取任务来执行。因为当我们需要处理一个大任务时,我们会把这个大任务分割为若干互不依赖的子任务,为了减少线程间的竞争,我们会把这些子任务分别放到不同的队列里,然后为每个队列创建一个单独的线程来执行队列里的任务,线程和队列一一对应。但是假设此时 A 线程已经把自己 A 队列里的所有子任务执行完毕,而 B 线程还没将对应的 B 队列里子任务执行完毕,此时已执行完毕自己队列全部子任务的线程 A 与其等着 B 进行合并,还不如去帮 B 线程干活,所以 A 线程就会去 B 线程的队列里窃取一个子任务来执行。在窃取操作中由于 A B 线程会同时访问 B 线程对应的子任务队列,所以为了减少窃取任务的线程 A 和被窃取任务线程 B 之间的竞争,通常会使用双端队列,被窃取任务线程 B 永远从双端队列的头部拿任务执行,而窃取任务的线程 A 永远从双端队列的尾部拿任务执行。
通过这种算法就可以充分利用线程进行并行操作,同时减少了线程间的竞争。但缺点就是在某些情况下还是存在竞争(双端队列里只有一个任务时)且消耗了更多的系统资源(创建多个线程和多个双端队列),可以说是一种空间换时间的优化。
转载地址:http://cvbai.baihongyu.com/