JAva同時の例-並列データ処理

7049 ワード

JDK 5はjava.util.concurrentというパッケージにある高度な同時APIを導入した.
より優雅で直感的なマルチスレッドプログラミングを考慮した.これは一部の人にとって新しいニュースではないことを知っていますが、ほとんどのプログラマーは依然としてThreadクラスとRunnableインタフェースを使ってjavaの多くの同時問題を解決していることに気づきました.実は、これらの問題の大部分は新しいAPIでより簡潔な方法で実現することができます.
このシリーズの投稿では、java.util.concrrentパッケージのクラスを使用して一般的な問題を解決する方法を説明します.次に、単純なパラレルデータ処理のソリューションを開始します.
あなたが今データ要素をたくさん持っていることを想像して、あなたは今それらの中のいくつかのデータを加工処理する必要があります.今、この任務を最も速いスピードで完成する必要がありますが、システムの他のすべての利用可能な資源を占有したくないです.
良いポリシーは、あらかじめ定義された最大のアクティブなスレッド数でスレッドプールを作成し、スレッドが使用可能になったときに、一度に1つのスレッドでデータユニットを処理することです.
このポリシーは、固定スレッドプールでタスクを迅速に実行できます.
runnableインタフェースを使用して、データ処理をシミュレートできます.
package com.ricardozuasti;
 
public class DataProcessor implements Runnable {
    public DataProcessor(int data){
        this.data = data;
    }
 
    @Override
    public void run() {
        System.out.println("Processing data: " + data);
        // Data processing goes here
    }
 
    private int data;
}

次に、ExecutorsツールクラスのnewFixedThreadPool(n)メソッドを使用して、新しいスレッドプールサービス(指定された最大アクティブスレッド数)を作成します.戻り値(ExecuterServiceインタフェースが実装されている)は、execute()メソッドとsubmit()メソッドを使用して、新しいタスクをコミットするために使用できます.
package com.ricardozuasti;
 
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
 
public class Concurrency1 {
 
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(5);
 
        for (int i = 0; i<100; i++){
            executor.execute(new DataProcessor(i));
        }
 
        System.out.println("Starting shutdown...");
        executor.shutdown();
 
        try {
            executor.awaitTermination(100, TimeUnit.SECONDS);
        } catch (InterruptedException ex) {
            System.out.println("Interrupted or timed out while awaiting termination");
        }
 
        System.out.println("All done!");
 
    }
}

すべての作業ユニットをExecutorServiceにコミットした後、クローズを通知することができます.これにより、現在実行されているスレッドがブロックされず、以前にコミットされたタスクを実行することを避けることができますが、新しいタスクがExecutorServiceに渡されるのを阻止するだけです.
実際にすべてのタスクを完了するにはawaitTermination()を使用します.
表示 Executors API 他に構築したいexecutorサービスがわかります.
英語の原文 , OSCHINAオリジナル翻訳