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