Javaの8並列ストリームの混乱/問題

user3145373 ツ :

私は、並列ストリームに新しいですし、値を計算します1つのサンプルプログラムを作成しようとしている* 100(100から1)、マップに格納します。コードを実行している間、私は、各反復に異なる数を取得しています。私は、誰もがそうするための適切な方法を知っている私を導いてくださいどこかで間違っている可能性があります。

コード

import java.util.*;
import java.lang.*;
import java.io.*;
import java.util.stream.Collectors;

public class Main{    
    static int l = 0;       
    public static void main (String[] args) throws java.lang.Exception {
        letsGoParallel();
    }       
    public static int makeSomeMagic(int data) {
        l++;
        return data * 100;
    }        
    public static void letsGoParallel() {
        List<Integer> dataList = new ArrayList<>();
        for(int i = 1; i <= 100 ; i++) {
            dataList.add(i);
        }
        Map<Integer, Integer> resultMap = new HashMap<>();
        dataList.parallelStream().map(f -> {
            Integer xx = 0;
            {
                xx = makeSomeMagic(f);
            }
            resultMap.put(f, xx);
            return 0;
        }).collect(Collectors.toList());
        System.out.println("Input Size: " + dataList.size());
        System.out.println("Size: " + resultMap.size());
        System.out.println("Function Called: " + l);
    }
}

Runnableをコード

最後の出力

入力サイズ:100

サイズ:100

関数が呼び出さ:98

たびに出力が異なるを実行します。私は、私はできません。この混乱/問題に自分のアプリケーションではなくにより、並列ストリームを使用します。私のアプリケーションでは、私はいくつかの同じ操作を実行する必要のある100〜200の固有の番号を持っています。要するに、これはプロセスの何かの機能があります。

彼らは次のとおりでした:

両方へのアクセスHashMapとのl変数がともにない出力は各ランで異なっている理由である、スレッドセーフ。

あなたがやろうとしているものを行うための正しい方法を収集しているStreamに要素をMap

Map<Integer, Integer> resultMap =
    dataList.parallelStream()
            .collect(Collectors.toMap (Function.identity (), Main::makeSomeMagic));

EDIT:l変数がまだで更新されていないあなたは、変数の最終値は、あなたにとって重要である場合は、独自のスレッドの安全性を追加する必要がありますので、このコードで安全な方法を通します。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=224887&siteId=1