2009-12-25 39 views
6

由於很多原因,在servlet中使用線程並不是好習慣。在Servlet中使用java.util.Timer是否安全?

java.util.Timer看起來像圍繞一個線程的包裝。那麼,使用它也不安全嗎? 如果是這樣,在servlet中安排任務的最安全方法是什麼?

+1

要獲得最佳答案,請詳細說明您確實需要它。 – BalusC 2009-12-25 13:40:17

+0

我真的不覺得這很重要,是嗎? – 2009-12-25 15:40:29

+1

您當然可以安全地使用它,但最安全(最好)的方式取決於實際的功能要求。詢問這個特定問題的人通常並不完全知道servlet的生命週期,當你玩線程時可能會導致問題。這是問題的根源,因爲它「不是一個好的做法」(因此實際上並不是這樣:))。 – BalusC 2009-12-25 16:12:52

回答

9

是的,你可以使用計時器。

其中一個重要要記住的是當servlet停止時取消定時器。如果您忘記取消定時器,您的web應用程序將遭受內存泄漏(類加載器泄漏,因爲定時器的線程通過其ContextClassLoader綁定到WebappClassLoader),並且無法多次部署。

+0

還有另一個安全包裝? – mebada 2009-12-25 12:36:13

+0

感謝您的努力 – mebada 2009-12-25 13:15:38

+0

請定義「安全」。你的意思是「安全訪問」或「無錯誤」或「易於使用」或......? – mhaller 2009-12-25 13:15:56

2

是的。這非常安全。 servlet容器將爲線程尋找HTTP請求,但是你可以自己產生adoringal線程,無論它們的生命週期是否限於請求的生命週期或更長的時間。

例如一個常見的模式是產生一個長時間運行的處理線程。 Servlet請求會將工作項放入隊列(用於帶外處理),而長時間運行的處理線程將處理這些工作項。

Here's an article from OReilly詳細說明servlet和EJB中的計時器使用情況。

+0

即使我在doPost或doGet方法中使用它? – mebada 2009-12-25 12:35:27

+0

是的。這很好 – 2009-12-25 12:59:19

+0

有一個參考或基準測試? – mebada 2009-12-25 13:09:24