ExecutorService w Java Servlet

Muszę wykonywać pewne zadania (głównie wywoływać wiele zewnętrznych adresów URL z parametrami żądania i odczytywać dane) jednocześnie w serwletach java i wysyłać odpowiedzi do użytkownika w ciągu kilku sekund. Potrzebuję czterech FutureTasków utworzonych w każdym żądaniu użytkownika w metodzie doGet. Każde zadanie trwa około 5-10 sekund, a całkowity czas odpowiedzi dla użytkownika wynosi około 15 sekund.

Czy możesz zasugerować, który z poniższych projektów jest lepszy podczas korzystania z ExecutorService w serwletu Java?

1) (Tworzenie nowegoFixedThreadPool na żądanie i wyłączanie ASAP)

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) (Tworzenie newFixedThreadPool podczas uruchamiania serwletu i wyłączanie go w celu zniszczenia serwletu)

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) (Tworzenie newCachedThreadPool podczas uruchamiania serwletu i wyłączanie go po zniszczeniu serwletu)

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

}

questionAnswers(2)

yourAnswerToTheQuestion