2012-10-18 58 views
4

對於每一個請求,都會有很多計算髮生。平均而言,答覆需要大約10分鐘的時間來處理。與此同時,如果用戶發送新的請求,先前的請求絕對沒有意義。取消上一個請求

所以我寫了一個代碼,我基本上中斷了執行它的前一個線程。在tomcat環境中這是一個好習慣嗎?有沒有更好的解決方案來處理它。中斷tomcat線程是否正常? 或者我應該管理自己的線程池,讓池爲我做計算?


更多信息: 基本上整個任務包裹着一個FutureTask。對於每一個請求,這個任務都被執行,並且任務的引用被一個ConcurrentHashMap存儲。對於每個請求,地圖中未來的所有內容都將被「取消」,然後繼續執行最新的請求。從而取消以前的請求。

回答

2

Q>我基本上中斷前一個線程執行它。在tomcat環境中這是一個好習慣嗎?
A>我認爲只要您很高興HTTP線程被阻塞10分鐘就沒有問題。這意味着沒有其他用戶能夠處理HTTP請求。否則,創建您自己的線程池並對其進行管理。

Q>這是tomcat環境中的一個好習慣嗎?
A>中斷Runnable s或Callable s可能會很棘手。例如,如果您的線程處於I/O操作的中間,則中斷可能會使數據處於損壞狀態。除此之外,這是非常正常的做法。我還建議使用您自己的線程池,以便您的服務器容量可預測。

你可以把你的大任務分成很多小任務嗎?提前有條件退出可能是中斷的好選擇。

或者,等待/確保第一個任務完成操作並且其他人只是返回相同的值,這對您的環境有意義嗎?如果是這樣,我寧願喜歡,而不是你的方法。有番石榴圖書館的LoadingCache正是這樣做。

+0

謝謝。但是沒有維護我們自己的線程池額外的開銷。每個請求都使用額外的線程。其次它是如何影響服務器容量的?我認爲tomcat使用一個CachedThreadPool,池的大小根據請求增加。 – Jatin

+0

最初,我用一個單獨的Pool編寫了代碼。但後來將它移植出來。游泳池有幾個優點。在一個sesnse,你正在打斷你擁有的線程,而不是一些隨機的線程。但是後來由於開銷而移植了 – Jatin

+0

如果你不關心變化的服務器容量,你可以繼續阻塞HTTP線程。無論如何,我認爲在每個工作10分鐘的情況下,創建新線程幾乎沒有成本。或者,如果你有一個靜態/共享線程池,成本可以忽略不計。 – mindas

0

我不知道我完全理解你的問題......

但是,如果你談論運行Tomcat應用程序內的線程池,並取消其今後的任務,我看到的是沒有問題的。

我不會打斷被Tomcat分配一個線程,除非我會寫代碼來處理中斷個人(如servlet類內)

+0

是的,我會處理中斷狀態。基本上會拋出中斷異常,並在正確的,將抓住參展,該任務被取消。這種方法唯一的問題是:我cancellign任務或threadpoolw之間沒有區別請求關閉 – Jatin