2010-12-15 55 views
0

我在tomcat上部署了一個web應用程序。在這個應用程序中有ExecutorService執行一些任務的併發執行。我的應用程序中也有一些使用Thread native的方法,如下所示執行併發執行。關機線程

new Thread(new Runnable() { 
public void run() { 
    //TODO: Perform some CRUD function 
} 
}).start(); 

當針對這些方法調用表單POST時,會啓動線程並根據需要執行函數執行。我的問題是,這是一個很好的設計方法,還是必須在每次會話後關閉線程,或者在tomcat關閉以進行維護時關閉線程。請有人指點我正確的方向。

+0

出於好奇,你如何做交易處理? – mhaller 2010-12-15 10:43:17

+0

使用Hibernate3事務管理器 - 任何建議? – Bitmap 2010-12-16 08:59:27

回答

1

我必須每個會話後關閉線程,還是我關閉線程當Tomcat關閉的發言權維護

我不太明白這個部分,而是創造新的隨機數線程是一個壞主意,首先它很昂貴,其次它不可能創建任意數量的線程,遲早你會遇到內存不足的例外。更好地使用線程池。

+0

好 - 何時關閉線程池是理想的選擇? – Bitmap 2010-12-15 09:54:51

+0

@Bitmap通常你不想在程序退出之前關閉池。正是因爲關閉/重新創建游泳池將會導致性能處罰,並且不會在正常循環中給您帶來任何好處。 – 2010-12-15 09:58:52

+0

@Victor Sorokin OIC - 所以我可以假設游泳池將一直活着,直到說tomcat正式關閉維護! – Bitmap 2010-12-15 10:01:52

0

創建和啓動新線程是相當昂貴的操作。如果您關注性能,請採用Executors.newCachedThreadPool方法。
此外,如果您不需要擔心線程限制耗盡的情況下使用某些Executors.newFixedThreadPool。請注意,如果用戶數超過池中的線程數,則使用此類執行程序可能會導致用戶延遲。但是,如果由任務執行的操作是短時間的,則用戶幾乎不會注意到延遲。

+0

默認情況下,Executors.newCachedThreadPool會爲我執行啓動和關閉功能嗎? – Bitmap 2010-12-15 09:52:17

+0

@Bitmap Pool將在需要執行提交的任務('Runnable'或'Callable')時啓動線程。池不會關閉線程,因爲它們會被重用於您提交的新任務 - 這就是爲什麼它被稱爲池的原因;) – 2010-12-15 09:56:30

0

有兩個問題的方法:

  1. 創建一個新的線程並不便宜。在客戶端連接之間共享線程池是更好的方法
  2. 可能會對JVM可創建的併發線程數量施加限制。一旦達到此限制,新的客戶端連接將被拒絕。

您可以通過使用java.util.concurrent包提供的設施來解決這些問題。詳情請參閱this tutorial

+0

好吧!所以說我正在使用Executors.newFixedThreadPool(7),你認爲什麼時候關閉執行程序是理想的?如何在應用程序類中使單個ExecutorService對象可用! – Bitmap 2010-12-15 09:59:22