2016-04-06 19 views
1

私は一連のキーを持っています。複数のスレッド間でストリームインスタンスを共有することは安全ですか?

class X { 
    private static String[] keys = {"k1", "k2", ... }; 

リクエストからキーの値を抽出する必要があります。私はこのようないくつかの要求の処理方法でリスト必要なオブジェクトを値を抽出して作成するためにmapを使用することができると思う:

public void processReq(Request req) { 
    ... 
    Stream.of(keys).map(k-> new Pack(k, req.getHeader(k))); 

しかし、すべての要求ごとStreamを作成するには、不要なタスクを探します。複数のスレッド間でStreamインスタンスを共有することが安全であるならば、私はこのようなコードを変更することができると思います。だから、

class X { 
    private static Stream<String> keys = Stream.of("k1", "k2", ...); 
    ... 

    public void processReq(Request req) { 
    ... 
    keys..map(k-> new Pack(k, req.getHeader(k))); 

は、この安全なように複数のスレッド間でStreamインスタンスを共有していますか?

+5

これは機能しません。ストリームは一度しかトラバースできません。 – Tunaki

+4

配列にストリームを作成するのに時間がかかりません。それには時間がかかります。 –

答えて

6

ストリームは、同じスレッドであっても、複数回使用することはできません。コレクションを使用する場合は、リスト(または配列)を使用してください。

private static final List<String> keys = Arrays.asList("k1", "k2", ...); 

これは複数回使用できます。あなたのコードで

List<Pack> packs = keys.stream() 
         .map(k-> new Pack(k, req.getHeader(k))) 
         .collect(Collectors.toList()); 

new Packまたはreq.getHeaderは、ほとんどの時間が費やされているところです。

関連する問題