Javaでのマルチスレッド:ExecutorService

Java 5では、特に並列アクセスの編成に関して、マルチスレッドを編成するために多くのことが追加されました。 この記事と後続の記事では、それらのいくつかについて説明します。



ExecutorService



Java 5より前は、複数のスレッドで作業を整理するために、サードパーティのプーリング実装を使用するか、独自に実装する必要がありました。 ExecutorService



の出現によりExecutorService



この必要性はなくなりました。



ExecutorService



は、1つ以上のスレッドで非同期コードを実行します。 ExecutorServiceインスタンスの作成は、特定の実装( ScheduledThreadPoolExecutor



またはThreadPoolExecutor



)を介して手動で行われますが、 Executors



クラスのファクトリーを使用する方が簡単です。 たとえば、2つのスレッドでプールを作成する必要がある場合、これは次のように行われます。

ExecutorService service = Executors.newFixedThreadPool(2);





必要に応じてスレッドを作成するが、非アクティブなスレッドを再利用する(そして、しばらくアクティブでないスレッドをクリーンアップする)スレッドのキャッシュプールを使用する場合、これは次のように設定されます。

ExecutorService service = Executors.newCachedThreadPool();





今、小さな例。 いくつかのコードを非同期に10回実行する必要があるとしましょう。 上記に基づいて、コードは次のようになります。

ExecutorService service = Executors.newCachedThreadPool();

for ( int i = 0; i < 10; i++) {

service.submit( new Runnable() {

public void run() {

// snip... piece of code

}

});

}








submit



メソッドは、渡されたRunnable



またはCallable



(値を返すことができる)の実行ステータスに関する情報を含むFuture



オブジェクトも返します。 これから、送信されたコードが成功したかどうか、またはまだ実行されているかどうかを確認できます。 Future



オブジェクトでget



メソッドを呼び出すと、 Callable



を返す値が返されます( Runnable



使用されている場合Runnable



null



)。 このメソッドには2つのチェック例外があります: InterruptedException



は、 interrupt()



メソッドを介して実行が中断されたときにRuntimeException



れますRunnable



またはCallable



コードがRuntimeException



ExecutionException



発生し、スレッド間の例外をサポートする問題を解決します。



ScheduledExecutorService



コードを非同期で定期的に実行する必要がある場合や、しばらくしてからコードを実行する必要がある場合、 ScheduledExecutorService



が助けになります。 コードを1つ以上のスレッドに配置し、実行が遅延する間隔または時間を構成できます。 間隔は、2つの連続した開始間の時間、または1つの実行の終了から別の実行の開始までの時間です。 ScheduledExecutorService



メソッドは、 ScheduledFuture



を実行しScheduledFuture



。これには、 ScheduledFuture



を実行するための遅延値も含まれます。



たとえば、実行を5秒間遅らせる場合は、次のコードが必要です。

ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();

service.schedule( new Runnable() { ... }, 5, TimeUnit.SECONDS);








1秒ごとに実行をスケジュールする場合:

ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();

service.scheduleAtFixedRate( new Runnable() { ... }, 0, 1, TimeUnit.SECONDS);








そして最後に、実行間に1秒の間隔でコード実行を割り当てたい場合:

ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();

service.scheduleWithFixedDelay( new Runnable() { ... }, 0, 1, TimeUnit.SECONDS);









All Articles