クラス SimpleAsyncTaskExecutor
- 実装されているすべてのインターフェース:
SerializableSE, AutoCloseableSE, ExecutorSE, AsyncTaskExecutor, TaskExecutor
- 既知の直属サブクラス
SimpleAsyncTaskScheduler
TaskExecutor 実装。JDK 21 以降では virtual threads オプションが提供されます。setTaskTerminationTimeout(long) による正常なシャットダウンをサポートしますが、実行時に実行スレッドごとにタスク追跡のオーバーヘッドが発生します。setConcurrencyLimit(int) による同時スレッド数の制限をサポートします。デフォルトでは、同時実行タスク数は無制限です。RetryTask と組み合わせることで、送信されたタスクを失敗後に再試行ポリシーに従って再実行できます。
注: この実装ではスレッドを再利用しません。特に多数の短期間のタスクを実行する場合は、代わりにスレッドプーリング TaskExecutor 実装を検討してください。あるいは、JDK 21 では、setVirtualThreads(boolean) を true に設定することを検討してください。
注意: このエグゼキュータはコンテキストレベルのライフサイクル管理には参加しません。引き渡された実行スレッド上のタスクは集中的に停止および再開することはできません。このような厳密なライフサイクル管理が必要な場合は、代わりに一般的な ThreadPoolTaskExecutor 設定を検討してください。
- 導入:
- 2.0
- 作成者:
- Juergen Hoeller
- 関連事項:
フィールドのサマリー
フィールド修飾子と型フィールド説明static final int並行性を「オフ」に切り替える: つまり、同時呼び出しを許可しません。static final int任意の数の同時呼び出しを許可します。つまり、同時実行を抑制しません。インターフェース AsyncTaskExecutor から継承されたフィールド
TIMEOUT_IMMEDIATE, TIMEOUT_INDEFINITEコンストラクターの概要
コンストラクターコンストラクター説明デフォルトのスレッド名プレフィックスを使用して、新しい SimpleAsyncTaskExecutor を作成します。SimpleAsyncTaskExecutor(StringSE threadNamePrefix) 指定されたスレッド名プレフィックスで新しい SimpleAsyncTaskExecutor を作成します。SimpleAsyncTaskExecutor(ThreadFactorySE threadFactory) 指定された外部スレッドファクトリで新しい SimpleAsyncTaskExecutor を作成します。方法の概要
修飾子と型メソッド説明voidclose()この close メソッドは、具体的なtask termination timeoutが設定されている場合、アクティブなスレッドの終了を追跡します。protected voiddoExecute(RunnableSE task) タスクを実際に実行するためのテンプレートメソッド。voidexecute(RunnableSE task) (スーパークラスの設定を介して)構成されている場合、同時実行スロットル内で、指定されたタスクを実行します。voidexecute(RunnableSE task, long startTimeout) 使用すべきではありません。final int許可される並列タスク実行の最大数を返します。final @Nullable ThreadFactorySE新しいスレッドを作成するために使用する外部ファクトリがあれば、それを返します。booleanisActive()このエグゼキュータがまだアクティブであるかどうかを返します。final boolean同時実行スロットルが現在アクティブかどうかを返します。protected ThreadSEnewThread(RunnableSE task) 指定されたタスクの新しいスレッドを作成します。voidsetCancelRemainingTasksOnClose(boolean cancelRemainingTasksOnClose) 閉じるときに残りのタスクをキャンセルするかどうか、つまり、close()呼び出し時にアクティブなスレッドを中断するかどうかを指定します。voidsetConcurrencyLimit(int concurrencyLimit) 許可されるタスクの並列実行の最大数を設定します。voidsetRejectTasksWhenLimitReached(boolean rejectTasksWhenLimitReached) 同時実行制限に達したときにタスクを拒否し、それ以降の実行試行時にTaskRejectedException(共通のRejectedExecutionExceptionSE を継承) をスローするかどうかを指定します。voidsetTaskDecorator(TaskDecorator taskDecorator) 実行しようとしているRunnableSE に適用するカスタムTaskDecoratorを指定します。voidsetTaskTerminationTimeout(long timeout) このエグゼキューターを閉じるときのタスク終了のタイムアウト (ミリ秒) を指定します。voidsetThreadFactory(@Nullable ThreadFactorySE threadFactory) この executor のローカルプロパティに依存する代わりに、新しいスレッドの作成に使用する外部ファクトリを指定します。voidsetVirtualThreads(boolean virtual) このエグゼキュータを仮想スレッドに切り替えます。FutureSE<?> submit(RunnableSE task) 実行可能な Runnable タスクを送信し、そのタスクを表す Future を受け取ります。<T> FutureSE<T> submit(CallableSE<T> task) Callable タスクを送信して実行し、そのタスクを表す Future を受け取ります。クラス CustomizableThreadCreator から継承されたメソッド
createThread, getDefaultThreadNamePrefix, getThreadGroup, getThreadNamePrefix, getThreadPriority, isDaemon, nextThreadName, setDaemon, setThreadGroup, setThreadGroupName, setThreadNamePrefix, setThreadPriorityクラス ObjectSE から継承されたメソッド
clone, equalsSE, finalize, getClass, hashCode, notify, notifyAll, toString, wait, waitSE, waitSEインターフェース AsyncTaskExecutor から継承されたメソッド
submitCompletable, submitCompletable
フィールドの詳細
UNBOUNDED_CONCURRENCY
public static final int UNBOUNDED_CONCURRENCY任意の数の同時呼び出しを許可します。つまり、同時実行を抑制しません。- 関連事項:
NO_CONCURRENCY
public static final int NO_CONCURRENCY並行性を「オフ」に切り替える: つまり、同時呼び出しを許可しません。- 関連事項:
コンストラクターの詳細
SimpleAsyncTaskExecutor
public SimpleAsyncTaskExecutor()デフォルトのスレッド名プレフィックスを使用して、新しい SimpleAsyncTaskExecutor を作成します。SimpleAsyncTaskExecutor
指定されたスレッド名プレフィックスで新しい SimpleAsyncTaskExecutor を作成します。- パラメーター:
threadNamePrefix- 新しく作成されたスレッドの名前に使用するプレフィックス
SimpleAsyncTaskExecutor
指定された外部スレッドファクトリで新しい SimpleAsyncTaskExecutor を作成します。- パラメーター:
threadFactory- 新しいスレッドの作成に使用するファクトリ
メソッドの詳細
setVirtualThreads
public void setVirtualThreads(boolean virtual) このエグゼキュータを仮想スレッドに切り替えます。Java 21 以上が必要です。デフォルトは
falseで、プラットフォームのスレッドを示します。代わりに仮想スレッドを作成するには、このフラグをtrueに設定します。- 導入:
- 6.1
setThreadFactory
この executor のローカルプロパティに依存する代わりに、新しいスレッドの作成に使用する外部ファクトリを指定します。内部 ThreadFactory Bean を指定することも、JZN(Jakarta EE サーバー上)から取得した ThreadFactory 参照やその他のルックアップメカニズムを指定することもできます。
- 関連事項:
getThreadFactory
新しいスレッドを作成するために使用する外部ファクトリがあれば、それを返します。setTaskDecorator
実行しようとしているRunnableSE に適用するカスタムTaskDecoratorを指定します。このようなデコレータは、必ずしもユーザー提供の
Runnable/Callableに適用されるのではなく、実際の実行コールバック(ユーザー提供のタスクのラッパーである可能性があります)に適用されることに注意してください。主な使用例は、タスクの呼び出しの周囲に実行コンテキストを設定するか、タスク実行の監視 / 統計を提供することです。
注意 :
TaskDecorator実装での例外処理は、execute呼び出しによる単純なRunnable実行に制限されています。#submit呼び出しの場合、公開されたRunnableは、例外を伝搬しないFutureTaskになります。例外を評価するには、キャストしてFuture#getを呼び出す必要がある場合があります。- 導入:
- 4.3
setTaskTerminationTimeout
public void setTaskTerminationTimeout(long timeout) このエグゼキューターを閉じるときのタスク終了のタイムアウト (ミリ秒) を指定します。デフォルトは 0 で、タスクの終了をまったく待機しません。ここで具体的に>0 のタイムアウトを指定すると、送信されたすべてのタスクがタスク追跡ランナブルにラップされ、タスクの数が多い場合にはかなりのオーバーヘッドが発生することに注意してください。ただし、実行時間が長いタスクを含む中程度のレベルの送信では、正常にシャットダウンするためにこれが可能です。
SimpleAsyncTaskExecutorは調整されたライフサイクル停止には参加せず、close()でのタスクの終了を待つだけであることに注意してください。- パラメーター:
timeout- ミリ秒単位のタイムアウト- 導入:
- 6.1
- 関連事項:
setCancelRemainingTasksOnClose
public void setCancelRemainingTasksOnClose(boolean cancelRemainingTasksOnClose) 閉じるときに残りのタスクをキャンセルするかどうか、つまり、close()呼び出し時にアクティブなスレッドを中断するかどうかを指定します。デフォルトは
falseで、アクティブなスレッドを一切追跡しないか、指定されたtaskTerminationTimeout経過後もまだ終了していない残りのスレッドのみを中断します。これをtrueに切り替えると、クローズ時に即時に中断されます。これは、taskTerminationTimeoutも指定されているかどうかに応じて、後続の終了タイムアウトと組み合わせて、または全く待機せずに実行されます。- 導入:
- 6.2.11
- 関連事項:
setRejectTasksWhenLimitReached
public void setRejectTasksWhenLimitReached(boolean rejectTasksWhenLimitReached) 同時実行制限に達したときにタスクを拒否し、それ以降の実行試行時にTaskRejectedException(共通のRejectedExecutionExceptionSE を継承) をスローするかどうかを指定します。デフォルトは
falseで、送信が受け入れられるまで呼び出し元をブロックします。これをtrueに切り替えると、即座に拒否されます。- 導入:
- 6.2.6
- 関連事項:
setConcurrencyLimit
public void setConcurrencyLimit(int concurrencyLimit) 許可されるタスクの並列実行の最大数を設定します。デフォルトの -1 は、同時実行制限がまったくないことを示します。これはスレッドプールの最大プールサイズに相当し、スレッド管理システムの一時的なオーバーロードを防ぎます。ただし、管理されたタスクキューを持つスレッドプールとは異なり、このエグゼキュータは、構成された同時実行制限に達したときにタスクが受け入れられるまでサブミッタをブロックします。このようなブロックのないキューベースのタスクハンドオフを希望する場合は、代わりに
ThreadPoolTaskExecutorの使用を検討してください。- 関連事項:
getConcurrencyLimit
public final int getConcurrencyLimit()許可される並列タスク実行の最大数を返します。isThrottleActive
public final boolean isThrottleActive()同時実行スロットルが現在アクティブかどうかを返します。- 戻り値:
- このインスタンスの同時実行制限がアクティブな場合、
true - 関連事項:
isActive
public boolean isActive()このエグゼキュータがまだアクティブであるかどうか、つまりまだ閉じられていないため、さらなるタスクの送信を受け入れるかどうかを返します。それ以外の場合は、タスク終了フェーズにあるか、すでに完全にシャットダウンされています。- 導入:
- 6.1
- 関連事項:
execute
(スーパークラスの設定を介して)構成されている場合、同時実行スロットル内で、指定されたタスクを実行します。- 次で指定:
- インターフェース
ExecutorSEのexecuteSE - 次で指定:
- インターフェース
TaskExecutorのexecute - パラメーター:
task- 実行するRunnable(非null)- 関連事項:
execute
使用すべきではありません。(スーパークラスの設定を介して)構成されている場合、同時実行スロットル内で、指定されたタスクを実行します。同時実行スロットル(アクティブな場合)をバイパスして、緊急タスク(「即時」タイムアウトで)を直接実行します。他のすべてのタスクはスロットルの影響を受けます。
- 次で指定:
- インターフェース
AsyncTaskExecutorのexecute - パラメーター:
task- 実行するRunnable(非null)startTimeout- タスクが開始される予定の期間(ミリ秒)。これはエグゼキューターへのヒントとして意図されており、即時タスクの優先処理を可能にします。一般的な値はAsyncTaskExecutor.TIMEOUT_IMMEDIATEまたはAsyncTaskExecutor.TIMEOUT_INDEFINITE(TaskExecutor.execute(Runnable)で使用されるデフォルト)です。- 関連事項:
submit
インターフェースからコピーされた説明:AsyncTaskExecutor実行可能な Runnable タスクを送信し、そのタスクを表す Future を受け取ります。Future は完了時にnullの結果を返します。6.1 では、このメソッドには
TaskExecutor.execute(Runnable)に委譲するデフォルトの実装が付属しています。- 次で指定:
- インターフェース
AsyncTaskExecutorのsubmit - パラメーター:
task- 実行するRunnable(非null)- 戻り値:
- タスクの保留中の完了を表す Future
submit
インターフェースからコピーされた説明:AsyncTaskExecutorCallable タスクを送信して実行し、そのタスクを表す Future を受け取ります。Future は、完了時に Callable の結果を返します。6.1 では、このメソッドには
TaskExecutor.execute(Runnable)に委譲するデフォルトの実装が付属しています。- 次で指定:
- インターフェース
AsyncTaskExecutorのsubmit - パラメーター:
task- 実行するCallable(非null)- 戻り値:
- タスクの保留中の完了を表す Future
doExecute
タスクを実際に実行するためのテンプレートメソッド。デフォルトの実装では、新しいスレッドを作成して開始します。
- パラメーター:
task- 実行する Runnable- 関連事項:
newThread
指定されたタスクの新しいスレッドを作成します。- パラメーター:
task- スレッドを作成するための Runnable- 戻り値:
- 新しいスレッドインスタンス
- 導入:
- 6.1
- 関連事項:
close
public void close()この close メソッドは、具体的なtask termination timeoutが設定されている場合、アクティブなスレッドの終了を追跡します。それ以外の場合は、この executor を閉じる必要はありません。- 次で指定:
- インターフェース
AutoCloseableSEのclose - 導入:
- 6.1