サーブレットAPIは「AsyncContext.start」について次のように述べています。
void start(java.lang.Runnable run)
コンテナに、おそらく管理対象スレッドプールからスレッドをディスパッチさせて、指定されたRunnableを実行させます。コンテナは、適切なコンテキスト情報をRunnableに伝播する場合があります。
この説明から、ジョブが待機を必要とするときにスレッドの使用を最適化するタスクにどのように関連するかは明確ではありません。
「サーブレットとJSP」では、Budi Kurniawanがサーブレット3.0非同期機能の例をAsyncContext.start
示しています。彼が使用している例では、例の簡略版を示します。
public void doGet(...) {
final AsyncContext asyncContext = request.startAsync();
asyncContext.start(new Runnable() {
@ Override
public void run() {
// do some work here which involves waiting
...
asyncContext.complete();
}
});
}
私が出会った他のほとんどの例では、サービスメソッドはAsyncContextをどこかに格納し、別の場所で処理されます(たとえば、バックグラウンドスレッドによって)。この例では、ジョブが別のスレッドに渡され、リクエストが完了したように見えます。私が理解しているように、今では単にワーカースレッドであり、待機に時間を浪費しています。
あるスレッドから別のスレッドにジョブ(待機を含む)を渡すことによって、実際に何かを得ることができますか?そうでない場合、その目的はAsyncContext.start(...)
何ですか?