2017-10-08 5 views
3

私はparallelStreamを使用する場合は、時々クライアント側で検索されたリストには、すべての要素を返さないJersey rest apiAsyncResponseとJava 8の並列ストリームの問題

@POST 
@Path("test") 
@Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.APPLICATION_JSON) 
public void test(final List<String> requests, @Suspended final AsyncResponse asyncResponse) { 

    List<String> resplist = new ArrayList(); 
    requests.parallelStream().forEach(req -> { 

     String resp = //some process to get (Always return string) 
     resplist.add(resp); 
    }); 

    asyncResponse.resume(resplist); 

} 

で春のブートを使用しています。

は、私はそれが29を返しますが、いつかそれは30を返しません(要求は常に同じである)

しかし、私は唯一のforEachで、通常のストリームを使用する場合、それは常に私の30個の要素を返す30を渡すと言うことができます。

これは何らかのバグですか?ユージンことで、これを答えとして、私は残りのAPIで

UPDATE

をparallelStreamを使用することはできません並列ストリームを使用するときに複数のスレッドが

ソリューションをスレッドセーフされていないのArrayListにレコードを追加したため問題でした 同期収集を使用する

Collection<String> resplist = Collections.synchronizedCollection(new ArrayList<String>()); 

答えて

3

私が見る限り、あなたはsiに頼っている一部では、ここでデ・効果:

.forEach(req -> { 

      String resp = //some process to get (Always return string) 
      resplist.add(resp); 
      }); 

あなたは、このようなArrayListなどの非スレッドセーフなコレクションに要素を追加するために、複数のスレッドを生成しています。

代わりに.collect(Collectors.toList())

+0

経由で収集する必要があります。答えをありがとう。 – Makky