2016-03-31 11 views
8

新しいJava8が用意されているので、私たちは非同期タスクのための素晴らしい機能を得ています。 CompletableFutureおよび.paralellStream()です。これをJava SEで実行するとわかりますが、ForkJoinPoolを利用しますが、たとえば次の例を実行するとどうなりますか?ワイルドフライやTomcatEE?JavaEEアプリケーションサーバーのCompletableFuture/parallelStream

//Here I start a comp.Future without giving an Executor 
test = CompletableFuture.supplyAsync(() -> timeConsumingMethod()); 
//Here I start a parallel stream 
mList.paralell().filter(...).collect(Collectors.toList()) 

何が起こるか、どこが、私は

  1. 例は@Stateful豆に走っている場合
  2. 例は@Stateless豆
  3. 例で走っているから、私のリソースを借りますCDI Beanで実行されます。
+0

最後に私が聞いた(それはしばらく経ちました)ここにあります:http://coopsoft.com/ar/Calamity2Article.html#EE – edharned

答えて

8

Java EEでForkJoinPoolを使用しないでください。 threads have to be managed by the containerのように、アプリケーションサーバーだけが並列処理のための構成を提供することになっています(Java EE 7のManagedExecutorServiceなど)。

奇妙なことに、this answerに記載されているメーリングリストには、ForkJoinPoolがEEコンテナ内のシングルスレッドに正常に劣化するというメッセージがあります。私はこれをglassfish 4.1でテストしました。通常のスレッドが作成されます。

@Singleton 
public class SomeSingleton { 
    public void fireStream() { 
     IntStream.range(0, 32) 
      .parallel() 
      .mapToObj(i -> String.format("Task %d on thread %s", 
       i, Thread.currentThread().getName())) 
      .forEach(System.out::println); 
    } 
} 

私は次のような出力が得られます:

Info: Task 20 on thread http-listener-1(4) 
Info: Task 10 on thread ForkJoinPool.commonPool-worker-3 
Info: Task 21 on thread http-listener-1(4) 
Info: Task 11 on thread ForkJoinPool.commonPool-worker-3 
Info: Task 22 on thread http-listener-1(4) 
Info: Task 8 on thread ForkJoinPool.commonPool-worker-3 
Info: Task 23 on thread http-listener-1(4) 
Info: Task 9 on thread ForkJoinPool.commonPool-worker-3 
Info: Task 18 on thread http-listener-1(4) 
Info: Task 14 on thread ForkJoinPool.commonPool-worker-3 
Info: Task 19 on thread http-listener-1(4) 
Info: Task 15 on thread ForkJoinPool.commonPool-worker-3 
Info: Task 16 on thread http-listener-1(4) 
Info: Task 17 on thread http-listener-1(4) 
Info: Task 4 on thread http-listener-1(4) 
Info: Task 5 on thread http-listener-1(4) 
Info: Task 6 on thread http-listener-1(4) 
Info: Task 7 on thread http-listener-1(4) 
Info: Task 2 on thread http-listener-1(4) 
Info: Task 3 on thread http-listener-1(4) 
Info: Task 0 on thread http-listener-1(4) 
Info: Task 1 on thread http-listener-1(4) 
Info: Task 26 on thread http-listener-1(4) 
Info: Task 27 on thread http-listener-1(4) 
Info: Task 24 on thread http-listener-1(4) 
Info: Task 25 on thread http-listener-1(4) 
Info: Task 12 on thread http-listener-1(4) 
Info: Task 13 on thread http-listener-1(4) 
Info: Task 30 on thread http-listener-1(4) 
Info: Task 31 on thread http-listener-1(4) 
Info: Task 28 on thread ForkJoinPool.commonPool-worker-0 
Info: Task 29 on thread ForkJoinPool.commonPool-worker-0 

はおそらく、劣化がほとんど個々の仕様はSE 8の機能を活用したJava EE 8、上で利用できるようになりますこのコードを実行します。


編集

私はGlassFishの4.1.1のソースコードをチェックしました、とForkJoinPoolForkJoinWorkerThreadFactoryまたはForkJoinWorkerThreadの単独使用はありません。したがって、アプリケーションサーバー管理の並列処理リソースは、これらの構造に基づいていません。残念ながら、実際には劣化メカニズムはありません。

+0

はい、私は「ダウングレード」も読んでいますが、それは2歳です。私が実例を実行するたびに、私はいつものように並列性を見ています:)私の仕事理論は、ManagedExecutorServiceを使用してアプリケーションサーバーの管理スレッドプールを取得することです。どのメーリングリストを参照していますか? – stevietheTV

+1

[This one](http://mail.openjdk.java.net/pipermail/lambda-dev/2013-April/009335.html)。 JCPで動作が遅く、Java EEに関連する場合は遅くなります。私はそれが出てきたときと同じ状態にあったならば、特にそれがSE 8の前に起こったために驚くことはないだろう。それは恐らく仕様の一部ではないということを意味する。たとえグラスフィッシュで働いていても、移植性を保証するものではないと私は信じています。 もっと明確なものを見つけようとします。 – andrepnh

+1

JDK8がリリースされたときに劣化が言及されましたが、Java EE 7仕様はJDK 7に基づいており、特別な方法でJDK8固有の機能は扱いません。うまくいけば、劣化はEE 8で標準化されるだろうが、これまでは何も見ていない。 – OndrejM

関連する問題