我需要在Java servlet中同时执行一些任务(主要是调用多个带请求参数的外部URL并读取数据),并在几秒钟内向用户发送响应。我正在尝试使用ExecutorService来实现这一目标。我需要在doGet方法中为每个用户请求创建四个FutureTasks。每个任务运行时间大约为5-10秒,总响应时间为15秒左右。
请问在使用ExecutorService时,以下哪种设计更好?
1) (每个请求创建一个新的FixedThreadPool,并尽快关闭它)
请问在使用ExecutorService时,以下哪种设计更好?
1) (每个请求创建一个新的FixedThreadPool,并尽快关闭它)
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) (在Servlet初始化期间创建新的FixedThreadPool,并在servlet销毁时关闭它)
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) 在Servlet Init期间创建newCachedThreadPool,并在servlet销毁时关闭它
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();
}
}
ExecutorService myThreadPool = null;
不安全。 - Bhesh Gurung