import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveAction;
import java.util.concurrent.TimeUnit;
public class ForkJoin {
private List<String> list = new ArrayList<String>();
private int groupNum =5; //分成5个小任务,分别获取list中的值
public void init() {
for(int i=0;i<20;i++) {
list.add("a" + i);
}
}
public static void main(String[] args) {
System.out.println("*");
ForkJoinPool pool = new ForkJoinPool();
ForkJoin a = new ForkJoin();
a.init();
int size = a.list.size();
Task task = a.new Task(0, size);
System.out.println("**");
pool.submit(task);
System.out.println("***");
try {
pool.awaitTermination(2, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
//阻塞当前线程直到 pool 中所有的任务都执行结束
// 关闭线程池
System.out.println("****");
pool.shutdown();
}
class Task extends RecursiveAction{
private static final int MIN_SIZE = 8;
private int start;
private int end;
public Task(int start, int end) {
this.start = start;
this.end = end;
}
protected void compute() {
boolean canCompute = end-start<=MIN_SIZE?true:false;
if(canCompute) {
System.out.println("...");
for(int i=start;i<=end;i++) {
print(i);
}
}else {
System.out.println("---");
int pos = start;
int step = (end - start)/groupNum;
for(int i=0;i<groupNum;i++) {
int last = pos + step;
if(last> end) {
last = end;
}
System.out.println("pos=" + pos + ", end=" + last);
Task t = new Task(pos, last);
pos += step + 1;
t.fork();
}
}
}
void print(int i) {
System.out.println(Thread.currentThread().getName() + " " +list.get(i));
}
}
}
相关推荐
Java多线程ForkJoinPool实例详解 Java多线程编程中的ForkJoinPool实例详解是Java 7中引入的一种高效的并发编程框架。ForkJoinPool是ExecutorService接口的实现,它管理工作窃取算法(Work-Stealing Algorithm)实现...
ForkJoinPool的设计理念基于分治策略(Divide and Conquer),适用于那些可以拆分成多个子任务的任务,并且这些子任务又可以进一步拆分,直到达到足够小的粒度可以直接执行。这个过程可以类比于计算机科学中的快速...
多线程 ForkJoinPool 补充:为什么不适合执行有block比如有io的任务 线程block的时候,线程池会调度线程池队列中的其他未线程运行,这是ExecutorService的机制; 但是ForkJoinPool中的ForkJoinWorkerThread工作机制...
Java线程池ForkJoinPool实例解析是Java并发编程中的一种高级主题,ForkJoinPool是Java 7中引入的一种新的线程池实现,它可以充分利用多CPU和多核CPU的优势,使得并发编程变得更加高效。 ForkJoinPool的优势在于,...
- **实现方式**: 可以利用`ForkJoinPool`来实现多线程版本的归并排序。 - **代码示例**: ```java public class ParallelMergeSort { private final int[] arrayToSort; private final int threshold; public ...
在IT行业中,多线程和线程池是提高程序并发性能和资源管理的关键技术。尤其在Java编程领域,它们在大型系统和并发密集型应用中扮演着重要角色。本篇文章将详细探讨“常用多线程模板”以及“鱼刺类(Fork/Join框架)...
所有并行流执行都使用相同的(单例)线程池:ForkJoinPool.commonPool()。 这就是为什么在并行流中执行 IO(更常见的是阻塞调用)非常糟糕的原因:被阻塞的线程无法被 JVM 中的所有并行流使用。 为此,您必须改用 ...
1. **工作窃取算法**:ForkJoinPool采用工作窃取算法,即线程不仅从自己的队列中获取任务,还会尝试从其他线程的队列中窃取任务,从而避免了线程空闲的情况。 2. **线程数量的自适应调整**:ForkJoinPool的线程数量...
4. **并发编程工具**:Java的并发工具类库(如Executor框架、ForkJoinPool等)可以简化多线程的实现。对于矩阵乘法,ForkJoinPool特别适合执行分治策略的任务。 5. **矩阵乘法原理**:理解矩阵乘法的基本原理,包括...
与传统的 ExecutorService 不同,ForkJoinPool 使用工作窃取算法,确保线程不会因为等待新任务而阻塞,而是能够从其他已完成的任务中窃取工作,从而提高系统的并行效率。 **RecursiveAction** 是一个抽象类,代表...
9. **J.U.C(java.util.concurrent)框架**:探讨并发库中如CompletableFuture、ForkJoinPool等高级特性和并发编程的最佳实践。 10. **实战经验**:通过实际案例分析,学习如何在项目中有效地使用多线程和同步技术...
每个任务都会被提交到ForkJoinPool,然后由池中的工作线程并行处理。这种方式可以显著提升抓取速度,尤其是在处理大量网页或者复杂结构的网站时。 不过,根据描述,XScrapper目前存在一些限制。"当前仅剪贴部分起...
java并发编程中CountDownLatch和CyclicBarrier是两个非常重要的线程控制和调度工具,经常被用于解决多线程程序设计中的线程等待问题。本文将对CountDownLatch和CyclicBarrier的使用场景和实现进行详细的介绍。 ...
这些流可以提高执行性能,以牺牲多线程的开销为代价。在这篇短文中,我们将看一下 Stream API的最大限制,同时看一下如何让并行流和线程池实例(ThreadPool instance)一起工作。 知识点:Java8引入了流的概念,流是...
`ThreadPoolExecutor`或`ForkJoinPool`等Java并发工具可以用来管理这些线程。 5. **错误处理与恢复**:在多线程环境下,错误处理变得更加复杂。需要确保当某个线程遇到错误时,不会影响其他线程的正常运行,并且...
`ForkJoinPool`和`RecursiveTask`或`RecursiveAction`是实现这个框架的关键类。此外,`CompletableFuture`类也被引入,它提供了一种更灵活的方式来处理异步计算的结果,支持链式调用和组合多个异步操作。 在并发...
- **ForkJoinPool 类**:提供了 Fork/Join 的执行服务,可以自动调整线程数量。 - **ForkJoinTask 类**:Fork/Join 框架中任务的基本类型,支持异步执行和结果获取。 **19. Java 8 Stream 并行计算原理** - **...
Java Fork/Join框架中的`ForkJoinPool`就是基于这种模式实现的。 以上这些多线程设计模式在实际开发中有着广泛的应用,理解并掌握它们对于提升Java程序的并发性能和稳定性至关重要。通过阅读“java多线程设计模式...
4. ForkJoinPool:专为分而治之(Divide and Conquer)算法设计的线程池,用于高效执行可以递归分割的任务。 尽管文档《java多线程设计模式详解》的具体内容我们不得而知,但以上罗列的知识点应该是多线程设计模式...
17. **并发工具类**:如`Executor框架`, `ForkJoinPool`, `Phaser`, `CompletableFuture`等,用于简化多线程编程。 18. **线程安全的类**:如`Atomic*`系列,提供原子操作,确保并发场景下数据的正确性。 19. **...