2012-12-22 122 views
2

我一直在整個網絡中拖釣。沒有一個真正的答案。我希望有人能給我一些建議。Java併發性問題線程vs executorservice

我正在嘗試構建的是一個自動採購商類型的應用程序,需要進行投標競拍並檢查我想購買的物品是否可用。

所以在概念上,我想我應該可以開始運行所有的時間(直到我告訴它停止)

一個線程,當它找到一個項目應該啓動另一個線程,要麼出價或購買該物品。

我的代碼全部做完了,它的機制就是我所堅持的線程。

的第一個問題是我已經能夠使用線程/可運行和使用也執行服務

但我不知道如何讓線程繼續處理所有實例啓動線程.....然後讓我發出某種命令時,我想停止程序,將停止線程的...

一些指導,將不勝感激

+2

只要您給它一個線程去做。如果您想定期執行某項操作,則可以使用計劃任務,該任務在完成時取消。 –

+0

嗨,彼得, 葉我想我明白了。目前我只是放了一段時間(runningvar),直到我殺了程序。我希望我可以在runnable類中使用一個變量,當我想停止正在運行的線程時,我只需將該變量更新爲false,這將導致線程結束。但我不知道如何獲得當前正在運行的線程的句柄或如何調用將更新該變量的類中的方法。 –

+0

線程池或['ExecutorService'](http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html)用於處理很多通常很短的任務。長時間循環輪詢不是一項應該以這種方式運行的任務。所以,這取決於應用程序的設計:您是否有幾個快速執行的任務,或者您是否希望在循環中運行更長的操作? – JimmyB

回答

1

據我瞭解你心目中未來:

  1. 紛紛跟帖爲了一些服務淘貨其投票不時
  2. 如果找到,那麼另一個線程應催生這個做招標,購買並得罪了其他其他買主誰沒有具體的項目這樣一個偉大的工具。
  3. 如果您不想再購買物品,請停止特定線程。

所有這些都可以通過您自己的線程框架使用JVM線程原語來實現(並且這樣做會很有趣!)。不過,我建議使用Spring FrameworkTask Execution and Scheduling詳細解釋瞭如何做到這一點。實質上:

  • 想要定期執行某些方法嗎?只要把@Scheduled就可以了! (地址#1)
  • 想要以異步方式執行某些方法嗎?放@Async!(地址#1)
  • 關於#3 - 取消/停止線程本身就是個問題。看看this問題/答案。到目前爲止,我發現的最好(推薦)方法是在內存中使用共享變量或在數據庫中使用某個值(如果應用程序在分佈式環境中運行)作爲標誌,要求後臺線程停止。

儘管聽起來很簡單,但您仍然需要了解發動機罩下發生了什麼,並瞭解一些關於彈簧的知識。另外@Sheculed/@Async任務在兩個不同的線程池中執行,您可能想要爲它們更新默認大小值 - 我只在生產部署後才瞭解到的教訓:-)

+0

感謝您的反饋,我也一直在考慮使用數據庫表來控制過程是否應該運行。有點像註銷按鈕,它設置註銷標誌,並反過來停止所有的子進程....或者我一直在尋找和同步變量?但是還沒有找到任何樣本 –

+0

只是爲了讓一些異步運行的任務使用Spring可能有點過分。 Java提供['ExecutorService'](http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html),使用起來非常簡單。 – JimmyB