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

Posted 那啥快看

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.
",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.
",results.size());
        
        results = apps.join();
        System.out.printf("Apps: %d files found.
",results.size());
        
        
    }
}

 

以上是关于JAVA并行框架Fork/Join:同步和异步的主要内容,如果未能解决你的问题,请参考以下文章

Fork/Join-Java并行计算框架

浅谈Java Fork/Join并行框架

多线程 fork/join 并行计算

java并发编程实战

Fork/Join框架

Java并发之Fork-Join