1

Java 7 の同時実行性と並列処理機能である Fork/Join Framework に手を染めています。

特定のパスの下にあるすべてのディレクトリのリストを表示しようとしています。これが正しいかどうか教えてもらえますか?

これが私のメインクラスです - タスクを開始する JoinForkExample

package com.skilledmonster.examples;

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

public class JoinForkExample {
    public static void main(String[] args) {
        ForkJoinPool forkJoinPool = new ForkJoinPool() ;
        List<File> directories = forkJoinPool.invoke(new DirectoryListingTask(new File("C:/xampp"))) ;
         for (int i = 0; i < directories.size(); i++) {
            File file = (File) directories.get(i);
            System.out.println(file.getAbsolutePath());
        }
    }
}

そして、これが私の実際のタスクです

package com.skilledmonster.examples;

import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.RecursiveTask;

public class DirectoryListingTask extends RecursiveTask<List<File>> {

    private static final FileFilter filter = new DirectoryFilter();

    private File file ;

    public DirectoryListingTask(File file) {
        this.file = file;
    }

    @Override
    protected List<File> compute() {
       List<RecursiveTask<List<File>>> forks = new LinkedList<>(); 
       List files = new ArrayList();
        if (file.isDirectory()) {
            File[] filteredFiles = file.listFiles(filter);
            if (null != filteredFiles) {
                files.addAll(Arrays.asList(filteredFiles));
            }
            for (File childFile : file.listFiles()) {
                DirectoryListingTask task = new DirectoryListingTask(childFile);
                forks.add(task);
                task.fork();
            }

            for (RecursiveTask<List<File>> task : forks) {
                files.addAll(task.join());
            }
        }
        return files ;
    }
}

私はほとんど意図した結果を得ています。しかし、これが正しいかどうかはよくわかりません。そして驚くべきことに、ジョイン/フォーク フレームワークを使用せずに同じことを実行した場合でも、実行の時間差に気付きません。

何かご意見は!

4

1 に答える 1

3

この作業は主に IO バウンドであるため、ここで Fork/Join を使用することはあまり役に立ちません。代わりに、計算集約的なタスクを試すことをお勧めします。また、Fork/Join 操作にはオーバーヘッドがあることに注意してください。フィボナッチ数列の計算に使用する場合、それに値するものではありません。また、シーケンシャル バージョンよりもパフォーマンスが遅くなると思います。

于 2012-07-19T04:26:42.177 に答える