Javaサーブレットでいくつかのタスク(ほとんどの場合、リクエストパラメータを使用して複数の外部URLを呼び出し、データを読み取る)を実行し、数秒以内にユーザーに応答を送信する必要があります.ExecutorServiceを使用して同じことを達成しようとしています. doGet メソッドのユーザー リクエストごとに 4 つの FutureTask を作成する必要があります。各タスクは約 5 ~ 10 秒実行され、ユーザーへの合計応答時間は約 15 秒です。
Java サーブレットで ExecutorService を使用する場合、次の設計のうちどれが優れているか教えてください。
1)(リクエストごとに newFixedThreadPool を作成し、できるだけ早くシャットダウンする)
public class MyTestServlet extends HttpServlet
{
ExecutorService myThreadPool = null;
public void init()
{
super.init();
}
protected void doGet(HttpServletRequest request,HttpServletResponse response)
{
myThreadPool = Executors.newFixedThreadPool(4);
taskOne = myThreadPool.submit();
taskTwo = myThreadPool.submit();
taskThree = myThreadPool.submit();
taskFour = myThreadPool.submit();
...
...
taskOne.get();
taskTwo.get();
taskThree.get();
taskFour.get();
...
myThreadPool.shutdown();
}
public void destroy()
{
super.destroy();
}
}
2) (サーブレットの初期化中に newFixedThreadPool を作成し、サーブレットの破棄時にシャットダウンする)
public class MyTestServlet extends HttpServlet
{
ExecutorService myThreadPool = null;
public void init()
{
super.init();
//What should be the value of fixed thread pool so that it can handle multiple user requests without wait???
myThreadPool = Executors.newFixedThreadPool(20);
}
protected void doGet(HttpServletRequest request,HttpServletResponse response)
{
taskOne = myThreadPool.submit();
taskTwo = myThreadPool.submit();
taskThree = myThreadPool.submit();
taskFour = myThreadPool.submit();
...
...
taskOne.get();
taskTwo.get();
taskThree.get();
taskFour.get();
...
}
public void destroy()
{
super.destroy();
myThreadPool.shutdown();
}
}
3) (サーブレットの初期化中に newCachedThreadPool を作成し、サーブレットの破棄時にシャットダウンする)
public class MyTestServlet extends HttpServlet
{
ExecutorService myThreadPool = null;
public void init()
{
super.init();
myThreadPool = Executors.newCachedThreadPool();
}
protected void doGet(HttpServletRequest request,HttpServletResponse response)
{
taskOne = myThreadPool.submit();
taskTwo = myThreadPool.submit();
taskThree = myThreadPool.submit();
taskFour = myThreadPool.submit();
...
...
taskOne.get();
taskTwo.get();
taskThree.get();
taskFour.get();
...
}
public void destroy()
{
super.destroy();
myThreadPool.shutdown();
}
}