4

並列性をサポートするJavaのIntel TBBのようなライブラリはありますか?Javaの並列性

+2

FYI:各質問にチェックマークを入れて回答を受け入れることができます。 – jzd

答えて

8

おそらく、あなたは

を探しているまさに明確にできたインテル®スレッディング・ビルディング・ブロック(インテル®TBB)は、C++プログラムでの並列性を表現する豊かで完全なアプローチを提供しています。これは、スレッド化エキスパートでなくても、マルチコアプロセッサのパフォーマンスを活用するのに役立つライブラリです。インテル®TBBは単なるスレッド置換ライブラリではありません。スケーラビリティとパフォーマンスのためにプラットフォームの詳細とスレッド化メカニズムを抽象化する、より高レベルのタスクベースの並列処理を表します。

これは、並行処理ライブラリが1998年から行っていると2004年

EDITでJava 5.0の一部を作っていたものです:あなたは、あなたのシステム上のすべての論理プロセッサを使用することができ、スレッドプールをしたいと言います。

ExecutorService es = Executors.newFixedThreadPool(
     Runtime.getRuntime().availableProcessors); 

// to add a number of tasks 
for(int i=0; i<numberOfTasks; i++) { 
    es.submit(new Callable<ResultType>() { 
     public ResultType call() { 
      return doWork(i); 
     } 
    } 
} 

これは、空きスレッドごとにdoWorkを実行します。

彼らの特徴を見ると、彼らは非常によく知られています。

私はスレッド認識メモリ割り当てのような低レベルの最適化のいくつかを見ました。 Javaでは、これはTLAB(Thread Local Allocation Buffers)と呼ばれ、透過的です。私は、ほとんどのJava開発者はそれらが存在することさえ知らないと思う。

結果と例外は、後で検査できる未来オブジェクトでキャプチャされます。あなたはこのようなたCountDownLatchとして、あるいはCyclicBarrierを

両方インテル(TBB 3.0)およびMicrosoftによって実装関節の仕様に基づいてC++ 0xのがunordered_mapとを模倣する新しいコンテナ(Visual Studioの2010)、 "条件変数" を持つことができます

  • 密接にそれは同時挿入とトラバーサルを許可
  • unordered_map C++ 0xのに似たインタフェース:それは前のconcurrent_hash_map以上の3つの利点があります。
  • インターフェイスによってロックが公開されていません。実装は内部的にロックを使用することがありますが、デッドロックの原因となるような方法でロックが公開されることはありません。それは内部的にロックを保持するかもしれませんが、ユーザ定義コードを呼び出す際に決してロックを保持しません。

JavaのConcurrentHashMapはConcurrentMapとMapのインターフェースをサポートしています。同時挿入とトラバーサルを許可し、ロックを公開しません。 ;)少なくとも9歳ですので、堅牢で安定しているはずです。

スレッドプールで使用できるPriorityQueueがあります。

+0

はい、私はマルチコアプロセッサとマルチプロセッサアプリケーションの利点を探しています。 – Kamahire

+1

+1はインテルTBBをチェックアウトします。表面的な見方では、これはjava.util.concurrentフレームワークに非常に似ています。これは、スレッドの低レベルの詳細を抽象化して待機/通知などを行い、[Executor](http: //download.oracle.com/javase/6/docs/api/java/util/concurrent/Executor.html)、ジョブ・キュー、['Callable'](http://download.oracle.com/javase/6 /docs/api/java/util/concurrent/Callable.html)。 –

+1

私はまったく同じことをしているのではないかと疑いますが、そのオブジェクトは私も同じだと考えてTBBの代わりに使うことができます。 –

4

Java5以降、java.util.concurrentパッケージで利用できます。

このエディションには、並行プログラミングの基礎を固め、既知の問題を修正するためのJavaメモリモデルの大幅な改良が含まれていました。 Javaでは、ライブラリーの後で単純に追加されるのではなく、最初から言語に並行処理が設計されています。

+0

私は並行性が擬視論とは異なると信じています。インテル®TBBライブラリー – Kamahire

+2

を調べてみてください。 –

0

java.util.concurrentパッケージを確認してください。並列プログラミングに役立つクラスがたくさんあります。

ところで、あなたはいくつかの回答を受け入れることを検討する必要があります。受け入れられない回答がある15の質問は、人々があなたの質問に答えないようにしています。

6

、このトピックのための良い本があります:

Java Concurrency in Practice 

Java Concurrency in Practice

+1

同時並行性は擬似とは異なると私は信じています。インテル®TBBライブラリー – Kamahire

+1

+1を直接参照してください。本書は絶対に推奨されていますが、Java5/6で使用可能な並行性構成を使用する方法を詳しく説明しています。 –

1

は俳優とソフトウェアトランザクショナルメモリを使用して同時実行フレームワークを提供しakkaを見てみましょう。もちろん、これは単なるビルディングブロックを提供するだけで、いくつかの並行コードを記述する必要がありますが、少し簡単になります。

0

一部のユーザーは、並行性と並列性の違いについて質問しています。 Concurencyは、同時に実行されるさまざまなプログラムを意味し、スケジューラは誰が実行中であるかを決定します。並列性とは、タスクに分割された1つのプログラムと、問題を解決するために異なるコアで同時に実行されるタスクを意味します。このタスクが他のプログラムとのリソースを必要とする場合(コアよりも多くのタスクが利用可能な場合)、同時に並行性と並列性が確保されます。 avoing競合状態は、並列処理での難しさの部分ではありませんが、大きな問題は、適切な結果を得るためにタスクを適切に分解する良い方法を見つけることです。非常にきめの細かいdecompostionには欠点(オーバーヘッド)がありますが、粗い並列処理(モノタスク)には欠点があります(コンピュータで利用可能なすべての処理能力を使用していません)。あなたは中期的な用語を見つける必要があります。最適化問題(数学)を行うことを意味します。

+1

これはまったくその質問に対する答えではありません。 –