我開始分配讀取包含100列和10萬行的CSV文件並將其寫入數據庫。前端
因此我從一個簡單的Java程序開始,運行一個while循環直到EOF,而後進行JDBC調用來存儲值。這是須要花一個小時才完成了,但後來我意識到程序的運行時比建立程序花費的時間更長。所以,任務並不像看起來那麼容易。那能夠作些什麼呢?固然,我意識到我須要並行完成任務。數據庫
線程對我來講彷佛老是很複雜。「Mutex」,「Semaphores」和「Monitors」的概念讓我望而卻步。因此我試着理解這個概念。Java使用Monitors來實現同步。Java的Monitors支持兩種線程同步:互斥和合做。編程
經過虛擬機對象鎖在Java中支持的互斥操做,使多個線程可以獨立地處理共享數據而不會相互干擾。合做,是經過等待和通知來實現的。此方法使線程可以朝着共同的目標一塊兒工做。bash
當線程到達監視區域的開頭時,它將被放入相關監視器的條目集中。這個集就像銀行櫃檯的隊列同樣。當一我的到達線路前端時,他們就能夠進行交易。架構
關於線程的每個講座或文章老是提到消費者和生產者問題。因此個人問題與此相似,對吧?我有一個讀取器(生產者),它讀取一行並將其提供給JDBC層(消費者)以將其寫入數據庫。併發
Java已經提供了阻塞隊列,使實現問題更容易。但我不能產生10萬個線程來作到這一點。我須要相似線程池的東西來限制線程數。只需一個簡單的循環和線程數就能夠了。該解決方案看起來很好,在架構上很📃, 而後我意識到我忘記了錯誤處理。如今我意識到在線程中處理異常很是困難,由於它們不會返回任何內容。他們還有其餘任何辦法嗎?因此,是的,Java 1.5中有「可調用接口」功能,它做爲一個線程運行但返回將來。但這是另外一個故事。框架
執行上述任務使我意識到,隨着複雜性的增長,維護此代碼將很是困難。此外,Java爲每一個生成的線程使用系統線程。因此產生線程是有限的。異步
我須要的是一個爲我提供併發處理的框架,我只能專一於它的業務邏輯部分。我找到了這樣一個框架:Akka。Akka基於Erlang actor模型。若是您閱讀上述問題的實現方式,則使用拉策略實現,消費者線程將在完成當前任務後執行新任務。因此咱們須要等到生產者準備好了。若是系統更具反應性,那不是很容易嗎?對於每一個事件,事件處理程序都應該準備好完成工做。分佈式
所以,與銀行相似地進行思考,之前咱們曾常常常站在隊列中,銀行很難維持這個隊列。有時客戶厭倦了排隊並離開。所以,銀行能夠作的是將此問題提交給第三方供應商並尋求解決方案。供應商建議使用令牌系統。讓全部顧客坐在椅子上,直到他們的代號出現。對於銀行而言,這聽起來是一個很好的解決方案,而且爲了增長錦上添花,供應商甚至準備好免費維護這個系統。想一想銀行會感覺到的快樂。在Akka以後,我感覺到了相似的快樂。Akka基於actors,因此actors是什麼?性能
actors給你帶來:
使用Akka很是容易。它能夠做爲依賴項添加到咱們的project.Simple jar文件中。因此,讓咱們親自動手,編寫一個Hello World程序。示例來自Akka文檔。
讓咱們定義一個actor,Greeter:
Greeter extends UntypedActor {
String greeting = "";
public void onReceive(Object message) {
if (message instanceof WhoToGreet)
greeting = "hello" + ((WhoToGreet) message).who;
else if (message instanceof Greet) // //Send the current greeting back to the sender
getSender().tell(new Greeting(greeting), getSelf());
else unhandled(message)
}
}
複製代碼
對,就是那樣。它只須要實現onRecieve方法,以便它對tell調用做出反應。
所以,要開始使用此actor,您須要建立一個actor系統:
final ActorSystem system = ActorSystem.create("helloakka");
// Create the greeter actor
final ActorRef greeter = system.actorOf(Props.create(Greeter.class), "greeter");
// Tell the greeter to change its greeting message
greeter.tell(new WhoToGreet("akka"));
複製代碼
所以,經過使用tell方法,您能夠調用該方法。因此Akka保證一次只調用一次OnReceive方法。就這麼簡單,你不須要考慮同步。
Akka是一個很是可擴展的軟件,不只在性能方面,並且在其有用的應用程序大小方面。Akka的核心,akka-actor,很是小,很容易被放入現有的項目中,你須要異步和無鎖併發而不會有麻煩。「向外擴展(Remoting)」確實看起來頗有意義,對吧?
Akka中的全部內容都設計爲在分佈式環境中工做:actor的全部交互都使用純消息傳遞,一切都是異步的。Actors容許您管理服務故障(Supervisors),負載管理(退避策略,超時和處理隔離),以及水平和垂直可擴展性(添加更多內核或機器)。
Actors每每更適合並行處理單元,這些處理單元對CPU要求不高,也可能更適合分佈式並行計算(更高的延遲但更高的吞吐量)。
因此我使用actor的感受很是好,比傳統線程更快。
公衆號:銀河系1號
聯繫郵箱:public@space-explore.com
(未經贊成,請勿轉載)