2012-10-11 117 views
0

好吧,這可能是一個非常大的問題。多線程同時回調函數

我有一個服務(說notifier)和方法[說notifyTransaction(Transaction trans)]這個服務遠程可用於回調。

現在還有其他服務說(transactionsReader),它一直讀取輸入的交易,並調用了通知的遠程方法是notifyTransaction(Transaction trans).

我們解釋一下你的問題,我想補充一點,我的交易包含更多比一個行動。而對於治療手術,我有一個功能說processOperation(Operation op).

processOperation(Operation op)實際上做了一些數據庫更新。

最新問題? 服務TransactionsReader以非常快的速度讀取傳入的事務並以比processOperation(Operation op)方法處理操作的速度快得多的速度調用notifyTransactions()

我想要做什麼? 我想在notifyTransactions()中使用multithreadint,以便我有多個線程來處理每個事務。

開始我的方法notifyTransactions()使用 ExecutorService executor = Executors.newFixedThreadPool(2); 和創建我的方法processOperation(操作OP)的任務。但是,這會爲每次撥打notifyTransactions()創建一個不同的池,因此我在幾秒鐘內就會有大約3000個池。最後它失去了記憶。

什麼可能是其他可能的解決方案?

感謝提前:)

回答

1

爲了啓動我用ExecutorService的執行人= Executors.newFixedThreadPool(2);在方法notifyTransactions()

這是你需要的問題ExecutorService實例在兩個都是通用的。如果你開始調用每個操作,那麼它會創建大量的線程。您應該只需撥打submit任務notifyTransactions()

您應該使用生產者消費者方法,使用BlockingQueue這是有界的。所以如果隊列滿了,生產者將停止,如果隊列爲空,消費者將停止。 所以在你的情況processOperation(Operation op)是一個生產者,將處理操作,並把它放在BlockingQueue和notifyTransactions()裏面,你將會出隊並相應處理。

+0

+1如果你要注入自己的阻塞隊列,那麼你應該實例化'ThreadPoolExceutor'直接:'新的ThreadPoolExecutor(來確定nthreads,來確定nthreads,0L,TimeUnit.MILLISECONDS,新的LinkedBlockingQueue (1000));' – Gray

+0

是。但是他每次調用線程池都犯了一個很大的錯誤。正如你所說的那樣,它只需要像這樣調用一次。 –