我需要執行一些任務(主要進行調用多個外部URL與請求參數和讀取數據),同時在Java servlet和幾個seconds.I內發送響應用戶想使用的ExecutorService來達到同樣的。我需要在doGet方法中的每個用戶請求中創建四個FutureTasks。每個任務運行約5-10秒,對用戶的總響應時間約爲15秒。的ExecutorService中的Java Servlet
可否請您提出以下哪些設計是更好的,而在一個Java servlet使用的ExecutorService?
1)(創建每個請求的newFixedThreadPool和關閉它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)(servlet初始化期間創建的newFixedThreadPool和關閉它上的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初始化期間創建newCachedThreadPool和關閉它在Servlet的destroy)
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();
}
}
容器創建並加載servlet的單個實例。所有請求都由同一個實例處理。所以,'ExecutorService myThreadPool = null;'是不安全的。 – 2012-08-02 21:54:01
那麼可以請建議如何在全局聲明ExecutorService?我的任務是綁在HTTP請求和幾秒鐘內完成 – user1263019 2012-08-03 00:00:19