JAVA并行框架Fork/Join(二):同步和异步

在Fork/Join框架中,提交任务的时候,有同步和异步两种方式。

invokeAll()的方法是同步的,也就是任务提交后,这个方法不会返回直到所有的任务都处理完了。

fork方法是异步的。也就是你提交任务后,fork方法立即返回,可以继续下面的任务。这个线程也会继续运行。

下面我们以一个查询磁盘的以log结尾的文件的程序例子来说明异步的用法。

package com.bird.concursey.charpet8;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;

public class FolderProcessor extends RecursiveTask<List<String>> {

    private static final long serialVersionUID = 1L;

    private String path;
    private String extension;

    public FolderProcessor(String path, String extension) {
        super();
        this.path = path;
        this.extension = extension;
    }

    @Override
    protected List<String> compute() {
        List<String> list = new ArrayList<String>();
        List<FolderProcessor> tasks = new ArrayList<FolderProcessor>();
        File file = new File(path);
        File content[] = file.listFiles();
        if(content != null) {
            for(int i = 0; i < content.length; i++) {
                if(content[i].isDirectory()) {
                    FolderProcessor task = new FolderProcessor(content[i].getAbsolutePath(), extension);
                    //异步方式提交任务
                    task.fork();
                    tasks.add(task);
                }else{
                    if(checkFile(content[i].getName())) {
                        list.add(content[i].getAbsolutePath());
                    }
                }
            }
        }
        if(tasks.size() > 50) {
            System.out.printf("%s: %d tasks ran.\n",file.getAbsolutePath(),tasks.size());
        }

        addResultsFromTasks(list,tasks);
        return list;
    }

    /**
     * that will add to the list of files
the results returned by the subtasks launched by this task.
     * @param list
     * @param tasks
     */
    private void addResultsFromTasks(List<String> list,
            List<FolderProcessor> tasks) {
        for(FolderProcessor item: tasks) {
            list.addAll(item.join());
        }
    }

    /**
     * This method compares if the name of a file
passed as a parameter ends with the extension you are looking for
     * @param name
     * @return
     */
    private boolean checkFile(String name) {
        return name.endsWith(extension);
    }

    public static void main(String[] args) {
        ForkJoinPool pool = new ForkJoinPool();
        FolderProcessor system = new FolderProcessor("C:\\Windows", "log");
        FolderProcessor apps = new FolderProcessor("C:\\Program Files", "log");

        pool.execute(system);
        pool.execute(apps);

        pool.shutdown();

        List<String> results = null;
        results = system.join();
        System.out.printf("System: %d files found.\n",results.size());

        results = apps.join();
        System.out.printf("Apps: %d files found.\n",results.size());

    }
}

原文地址:https://www.cnblogs.com/shamo89/p/9774784.html

时间: 2024-10-10 04:42:25

JAVA并行框架Fork/Join(二):同步和异步的相关文章

JAVA并行框架Fork/Join(一):简介和代码示例

一.背景 虽然目前处理器核心数已经发展到很大数目,但是按任务并发处理并不能完全充分的利用处理器资源,因为一般的应用程序没有那么多的并发处理任务.基于这种现状,考虑把一个任务拆分成多个单元,每个单元分别得到执行,最后合并每个单元的结果. Fork/Join框架是JAVA7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架.它非常类似于HADOOP提供的MapReduce框架,只是MapReduce的任务可以针对集群内的所有计算节点,可以

Java 并发编程 -- Fork/Join 框架

概述 Fork/Join 框架是 Java7 提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架.下图是网上流传的 Fork Join 的运行流程图,直接拿过来用了: 工作窃取算法 工作窃取(work-stealing)算法是指某个线程从其他队列里窃取任务来执行.那么为什么要使用这个算法呢?假如我们需要做一个比较大的任务,可以把这个任务分割为若干个互不依赖的子任务,为了减少线程间的竞争,把这些子任务分别放到不同的队列里,并为每个队列创

Java多线程之~~~Fork/Join框架的同步和异步

在Fork/Join框架中,提交任务的时候,有同步和异步两种方式.以前使用的invokeAll()的方法是同步的,也就是任 务提交后,这个方法不会返回直到所有的任务都处理完了.而还有另一种方式,就是使用fork方法,这个是异步的.也 就是你提交任务后,fork方法立即返回,可以继续下面的任务.这个线程也会继续运行. 下面我们以一个查询磁盘的以log结尾的文件的程序例子来说明异步的用法. package com.bird.concursey.charpet8; import java.io.Fil

Java并发编程--Fork/Join框架使用

上篇博客我们介绍了通过CyclicBarrier使线程同步,但是上述方法存在一个问题,那就是如果一个大任务跑了2个线程去完成,如果线程2耗时比线程1多2倍,线程1完成后必须等待线程2完成,等待的过程线程1没法复用.现在我们准备解决这个问题,我们希望线程1完成自己的任务后能去帮助线程2完成一部分任务.Java7引如了Fork/Join框架可以很好的解决这个问题. Fork/Join是一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最后汇总每个小任务结果后得到大任务结果的框架.fork

JAVA中的Fork/Join框架

看了下Java Tutorials中的fork/join章节,整理下. 什么是fork/join框架 fork/join框架是ExecutorService接口的一个实现,可以帮助开发人员充分利用多核处理器的优势,编写出并行执行的程序,提高应用程序的性能:设计的目的是为了处理那些可以被递归拆分的任务. fork/join框架与其它ExecutorService的实现类相似,会给线程池中的线程分发任务,不同之处在于它使用了工作窃取算法,所谓工作窃取,指的是对那些处理完自身任务的线程,会从其它线程窃

Java对多线程~~~Fork/Join同步和异步帧

于Fork/Join骨架,当提交的任务,有两个同步和异步模式.它已被用于invokeAll()该方法是同步的.是任何 务提交后,这种方法不会返回直到全部的任务都处理完了.而还有还有一种方式,就是使用fork方法,这个是异步的.也 就是你提交任务后,fork方法马上返回.能够继续以下的任务. 这个线程也会继续执行. 以下我们以一个查询磁盘的以log结尾的文件的程序样例来说明异步的使用方法. package com.bird.concursey.charpet8; import java.io.Fi

JAVA并行框架学习之ForkJoin

当硬件处理能力不能按照摩尔定律垂直发展的时候,选择了水平发展,多核处理器已经广泛应用.未来随着技术的进一步发展,可能出现成百上千个处理核心,但现有的程序运行在多核心处理器上并不能得到较大性能的提升,主要的瓶颈在于程序本身的并发处理能力不强,不能够合理的利用多核心资源. 现有的处理方案是从软件入手,试图采用多线程,是程序在同一时间支持多个任务的计算,这种多线程的处理方案在处理器数目较少的情况下可以较为明显的提高应用性能,但我们更加青睐于由硬件实现的多线程处理模式,但这一领域至今没有很好的结果. F

jdk7 并行计算框架Fork/Join

故名思义,拆分fork+合并join.jdk1.7整合Fork/Join,性能上有大大提升. 思想:充分利用多核CPU把计算拆分成多个子任务,并行计算,提高CPU利用率大大减少运算时间.有点像,MapReduce思路感觉大致一样. jdk7中已经提供了最简洁的接口,让你不需要太多时间关心并行时线程的通信,死锁问题,线程同步,下面是它提供的接口: 简单示例: package tank.forjoin.demo; import java.util.concurrent.RecursiveTask;

【Java&amp;Android开源库代码剖析】のandroid-async-http(如何设计一个优雅的Android网络请求框架,同时支持同步和异步请求)开篇

在<[Java&Android开源库代码剖析]のandroid-smart-image-view>一文中我们提到了android-async-http这个开源库,本文正式开篇来详细介绍这个库的实现,同时结合源码探讨如何设计一个优雅的Android网络请求框架.做过一段时间Android开发的同学应该对这个库不陌生,因为它对Apache的HttpClient API的封装使得开发者可以简洁优雅的实现网络请求和响应,并且同时支持同步和异步请求. 网络请求框架一般至少需要具备如下几个组件:1