web-dev-qa-db-ja.com

Javaはマルチコアプロセッサ/並列処理をサポートしていますか?

現在、ほとんどのプロセッサには2つ以上のコアが搭載されているため、マルチコアプログラミングが大流行しています。 Javaでこれを利用する機能はありますか? JavaにはThreadクラスがありますが、これはマルチコアが一般的になる前にかなり長い時間でした。Javaで複数のコアを使用できる場合、どのクラス/手法が使用する?

36
Rafe Kettler

Javaはマルチコアプロセッサ/並列処理をサポートしていますか?

はい。また、実装が「真のマルチスレッド化」または「リアルスレッド化」のセールスポイントを追加した他のプログラミング言語のプラットフォームでもあります。新しいリリースで導入された G1 Garbage Collector は、マルチコアハードウェアも利用します。

実際のJava並行性

Javaの並行性の実践本のコピーを取得してください。


Javaで複数のコアを使用できる場合、どのクラス/技術を使用しますか?

Java.util.concurrent

ユーティリティクラス同時プログラミングで一般的に役立ちます。このパッケージには、いくつかの小さな標準化された拡張可能なフレームワークと、便利な機能を提供するクラスが含まれています。主なコンポーネントの簡単な説明を次に示します。

執行者

Executorは、スレッドプール、非同期IO、軽量タスクフレームワークなど、カスタムスレッドのようなサブシステムを定義するためのシンプルな標準化されたインターフェイスです。

キュー

Java.util.concurrent ConcurrentLinkedQueueクラスは、効率的でスケーラブルなスレッドセーフなノンブロッキングFIFOキューを提供します。

タイミング

TimeUnitクラスは、タイムアウトベースの操作を指定および制御するための複数の粒度(ナノ秒を含む)を提供します。パッケージのほとんどのクラスには、無期限の待機に加えて、タイムアウトに基づく操作が含まれています。

シンクロナイザー

4つのクラスは、一般的な特殊目的の同期イディオムを支援します。 Semaphoreは、古典的な並行性ツールです。 CountDownLatchは、指定された数のシグナル、イベント、または条件が保持されるまでブロックするための非常にシンプルでありながら非常に一般的なユーティリティです。 [...]

同時コレクション

キューに加えて、このパッケージはマルチスレッドコンテキストで使用するために設計されたいくつかのコレクション実装を提供します:ConcurrentHashMapCopyOnWriteArrayList、およびCopyOnWriteArraySet


これは、スレッドの数を使用可能なCPUの数に一致させたい場合にも役立ちます。例えば:

int n = Runtime.getRuntime().availableProcessors();
41
bakkal

ほとんどのJava実装では、Javaスレッドが実際のOSスレッドであることに依存できます。その結果、オペレーティングシステムは、ワークロードがThreadクラスを使用する場合、複数のコアに分散されます。

オペレーティングシステムのスレッドは、コモディティマルチコアシステムよりもずっと前の日付であるため、実際には問題ではありません。作成されたマルチコアシステムの唯一の違いは、時間多重化されたオペレーティングシステムスレッドを複数のコア上で真の同時スレッドとして実行できるようにすることでした。

9
Gian

Java 5は、マルチコアシステムのメリットを享受できる同時実行アプリケーションの構築に役立つJava.util.concurrentパッケージを導入しました。このパッケージは、Java 1.4以前(同期、待機、通知など)で提供されているマルチスレッド機能をはるかに超えています。

Java 7に Fork/Join フレームワークを含めて、マルチコアシステムの利用を容易にする提案があります。

7

Ateji PXにはnew機能があり、Java pi-calculusに触発された並列プリミティブを持つ言語スレッドプログラミングやスレッドベースのすべて(タスク、エグゼキューターなど)とはまったく異なります。

ほとんどのハードウェアレベルの概念へのAPIアクセスを提供するスレッドライブラリとは対照的に、並列処理により言語レベルでこの方法が導入され、マルチコアプログラミングがより簡単かつ直感的になります。

これは、読む価値のある並列プログラミングに対する根本的に新しいアプローチです(免責事項:私はAteji PXのデザイナーです)。ホワイトペーパーはこちらです http://www.ateji.com/px/whitepapers/Ateji%20PX%20for%20Java%20v1.0.pdf

2
Patrick Viry

はい。 Javaは concurrent API を提供し、マシンのマルチコアプロセッサの利点を活用します。

ランタイムから利用可能なプロセッサカウントを取得し、そのカウントを使用して ExecutorService の多くのAPIを介して Executors を作成できます。

ThreadPoolExecutor APIを使用して同じことを実現することもできます。

Java 8はもう1つのAPIを提供します。newWorkStealingPoolは、使用可能なすべてのプロセッサーを使用してForkJoinPoolを作成します。プロセッサカウントをパラメーターとして渡す必要はありません。

コードのサンプルをご覧ください。

int processorCount = Runtime.getRuntime().availableProcessors();

ExecutorService executor1 = Executors.newFixedThreadPool(processorCount);
ExecutorService executor2 =  
                            Executors.newScheduledThreadPool(processorCount);
ExecutorService executor3 = Executors.newWorkStealingPool(); // Java-8 API
ForkJoinPool forkJoinPool = new ForkJoinPool(processorCount);

関連するSEの質問の権利執行者を見てください:

JavaのFork/JoinとExecutorService-どちらを使用するか

0
Ravindra babu