2012-01-03 45 views
0

我正在使用Java 1.6以下的併發功能來脫機執行某些任務。當通過註冊創建的用戶,我需要執行一些記錄點播任務&我不希望阻止用戶,所以我一直在使用下面的代碼通過Java中的ExecutorService實現併發性

java.util.concurrent.ExecutorService myservice = Executors.newSingleThreadExecutor(); 
    myservice.execute(new myTask(user)); 

在這裏,我有一個在Run方法中實現Runnable &的內部類myTask,我在做脫機活動(從而使它成爲非阻塞調用)。

現在,一旦用戶登錄到網站,點擊某些動作(網頁上的按鈕),我需要執行類似的離線活動&我不想將該呼叫作爲阻止呼叫。我在這個頁面上有4個動作需要執行離線任務。

可以使用類似上面的代碼與4個不同的內部類&在他們內部執行脫機活動?如果不是,還有什麼替代方案?

謝謝!

回答

0

如果您不期望高水平的併發請求,則可以使用Executors。在這種情況下使用Thread pool

如果你的是一個高度併發的應用程序,並且你應該保證動作的處理(即使在jvm崩潰的情況下)並且你希望這些動作是事務性的,那麼消息傳遞(JMS)可能就是解決方案。

我已經成功地在網絡應用程序中成功地使用了帶有池的執行程序。然而,不建議在Web應用程序中創建線程,並且不允許在EJB中允許該線程不受容器管理。

static final int POOL_SIZE=10; 
ExecutorService pool = Executors.newFixedThreadPool(POOL_SIZE); 

您還可以閱讀這篇好文章:Java Concurrency

+0

我正在使用Struts2&在struts action中,我有這個執行器線程。你能提供關於如何實現線程池的示例行嗎?我需要配置線程池大小嗎?如果是這樣,在哪裏?我正在使用tomcat 6服務器。 – Mike 2012-01-03 04:18:15

+0

@Mike添加了示例代碼。您需要確保在webapp關閉之前,只創建一次花費池並關閉。 – 2012-01-03 04:23:50

+0

我還在使用這些API的新功能。我可以看到你已經調用newFixedThreadPool。但那麼它將如何調用myTask,它是我的實現Runnable接口的內部類?我需要調用pool.execute(new myTask(user));另外,如果超過10個用戶嘗試訪問網站會發生什麼情況? – Mike 2012-01-03 04:27:38

0

在添加到您的線程池,你應該使用一個線程安全的隊列,允許超過可用線程更多的工作。