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);

Source: https://habr.com/ru/post/J116363/


All Articles