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