`

多线程ForkJoinPool

    博客分类:
  • java
 
阅读更多

 

 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多线程编程中的ForkJoinPool实例详解是Java 7中引入的一种高效的并发编程框架。ForkJoinPool是ExecutorService接口的实现,它管理工作窃取算法(Work-Stealing Algorithm)实现...

    Java新的线程持池ForkJoinPool.pdf

    ForkJoinPool的设计理念基于分治策略(Divide and Conquer),适用于那些可以拆分成多个子任务的任务,并且这些子任务又可以进一步拆分,直到达到足够小的粒度可以直接执行。这个过程可以类比于计算机科学中的快速...

    ForkJoinPool

    多线程 ForkJoinPool 补充:为什么不适合执行有block比如有io的任务 线程block的时候,线程池会调度线程池队列中的其他未线程运行,这是ExecutorService的机制; 但是ForkJoinPool中的ForkJoinWorkerThread工作机制...

    Java线程池ForkJoinPool实例解析

    Java线程池ForkJoinPool实例解析是Java并发编程中的一种高级主题,ForkJoinPool是Java 7中引入的一种新的线程池实现,它可以充分利用多CPU和多核CPU的优势,使得并发编程变得更加高效。 ForkJoinPool的优势在于,...

    13、线程池ForkJoinPool实战及其工作原理分析(1).pdf

    - **实现方式**: 可以利用`ForkJoinPool`来实现多线程版本的归并排序。 - **代码示例**: ```java public class ParallelMergeSort { private final int[] arrayToSort; private final int threshold; public ...

    常用多线程模板与鱼刺类多线程线程池应用小例子

    在IT行业中,多线程和线程池是提高程序并发性能和资源管理的关键技术。尤其在Java编程领域,它们在大型系统和并发密集型应用中扮演着重要角色。本篇文章将详细探讨“常用多线程模板”以及“鱼刺类(Fork/Join框架)...

    parallel-stream-fork-join-pool

    所有并行流执行都使用相同的(单例)线程池:ForkJoinPool.commonPool()。 这就是为什么在并行流中执行 IO(更常见的是阻塞调用)非常糟糕的原因:被阻塞的线程无法被 JVM 中的所有并行流使用。 为此,您必须改用 ...

    35 拆分你的任务—学习使用Fork-Join框架.pdf

    1. **工作窃取算法**:ForkJoinPool采用工作窃取算法,即线程不仅从自己的队列中获取任务,还会尝试从其他线程的队列中窃取任务,从而避免了线程空闲的情况。 2. **线程数量的自适应调整**:ForkJoinPool的线程数量...

    java多线程技术实现矩阵乘法计算

    4. **并发编程工具**:Java的并发工具类库(如Executor框架、ForkJoinPool等)可以简化多线程的实现。对于矩阵乘法,ForkJoinPool特别适合执行分治策略的任务。 5. **矩阵乘法原理**:理解矩阵乘法的基本原理,包括...

    java7 并发编程forjoinpool

    与传统的 ExecutorService 不同,ForkJoinPool 使用工作窃取算法,确保线程不会因为等待新任务而阻塞,而是能够从其他已完成的任务中窃取工作,从而提高系统的并行效率。 **RecursiveAction** 是一个抽象类,代表...

    马士兵多线程训练营笔记

    9. **J.U.C(java.util.concurrent)框架**:探讨并发库中如CompletableFuture、ForkJoinPool等高级特性和并发编程的最佳实践。 10. **实战经验**:通过实际案例分析,学习如何在项目中有效地使用多线程和同步技术...

    XScrapper:利用ForkJoinPool框架按页面抓取内容并对每个元素划分任务的高性能Web抓取器注意:当前仅抓取部分有效,REST端点尚未起作用

    每个任务都会被提交到ForkJoinPool,然后由池中的工作线程并行处理。这种方式可以显著提升抓取速度,尤其是在处理大量网页或者复杂结构的网站时。 不过,根据描述,XScrapper目前存在一些限制。"当前仅剪贴部分起...

    java并发编程中CountDownLatch和CyclicBarrier的使用借鉴.pdf

    java并发编程中CountDownLatch和CyclicBarrier是两个非常重要的线程控制和调度工具,经常被用于解决多线程程序设计中的线程等待问题。本文将对CountDownLatch和CyclicBarrier的使用场景和实现进行详细的介绍。 ...

    Java8并行流中自定义线程池操作示例

    这些流可以提高执行性能,以牺牲多线程的开销为代价。在这篇短文中,我们将看一下 Stream API的最大限制,同时看一下如何让并行流和线程池实例(ThreadPool instance)一起工作。 知识点:Java8引入了流的概念,流是...

    java实现FTP多线程断点续传

    `ThreadPoolExecutor`或`ForkJoinPool`等Java并发工具可以用来管理这些线程。 5. **错误处理与恢复**:在多线程环境下,错误处理变得更加复杂。需要确保当某个线程遇到错误时,不会影响其他线程的正常运行,并且...

    辽宁最新版多线程1.8

    `ForkJoinPool`和`RecursiveTask`或`RecursiveAction`是实现这个框架的关键类。此外,`CompletableFuture`类也被引入,它提供了一种更灵活的方式来处理异步计算的结果,支持链式调用和组合多个异步操作。 在并发...

    深入浅出Java多线程.pdf

    - **ForkJoinPool 类**:提供了 Fork/Join 的执行服务,可以自动调整线程数量。 - **ForkJoinTask 类**:Fork/Join 框架中任务的基本类型,支持异步执行和结果获取。 **19. Java 8 Stream 并行计算原理** - **...

    多线程设计模式.rar

    Java Fork/Join框架中的`ForkJoinPool`就是基于这种模式实现的。 以上这些多线程设计模式在实际开发中有着广泛的应用,理解并掌握它们对于提升Java程序的并发性能和稳定性至关重要。通过阅读“java多线程设计模式...

    java多线程设计模式详解

    4. ForkJoinPool:专为分而治之(Divide and Conquer)算法设计的线程池,用于高效执行可以递归分割的任务。 尽管文档《java多线程设计模式详解》的具体内容我们不得而知,但以上罗列的知识点应该是多线程设计模式...

    java面试题_多线程(68题)

    17. **并发工具类**:如`Executor框架`, `ForkJoinPool`, `Phaser`, `CompletableFuture`等,用于简化多线程编程。 18. **线程安全的类**:如`Atomic*`系列,提供原子操作,确保并发场景下数据的正确性。 19. **...

Global site tag (gtag.js) - Google Analytics