Ⅰ java編程的actor模式如何實現
Actor模型是一種常見的並發模型,它與常見的共享內存(同步鎖)模型不同,它將程序分為許多獨立的計算單元——Actor,每個Actor獨立管理自己的資源,不同Actor之間通過消息傳遞來交互。它的優勢在於全非同步執行,避免線程阻塞,提升CPU使用率,同時非同步交互也不需要考慮加鎖和線程同步的問題。
Actor模型在業界有許多應用,如游戲伺服器框架Skynet、編程語言Erlang等。然而,由於歷史原因,在Java下的應用相對較少,知名項目為基於Scala的Akka。盡管Actor模型不是萬能的,但非同步編程會需要編寫更多的回調代碼,原本的一步需要拆分成若干步來處理,這無疑增加了代碼編寫復雜度。
本文旨在學習和研究,使用Java實現一個簡單Actor模型,其功能模仿Skynet,支持的功能包括創建Actor、發送消息、休眠Actor以及網路通信等。
Actor是Actor模型中的核心概念,每個Actor獨立管理自己的資源,並通過Message與其他Actor之間通信。每個Actor由單線程驅動,相當於Skynet中的服務,不斷從mailbox(使用無界阻塞的LinkedBlockingQueue)中獲取尚未處理的Message。
Actor類是抽象類,處理消息的handleMessage方法為抽象方法,需要每個具體類來重載實現。Node代表節點,與Skynet中節點意義相同,它是一個獨立的Java進程,有自己的IP和埠,Node之間通過非同步的網路通信發送和接收消息。一個Node中可以運行多個Actor,一個Actor僅可與一個Node綁定。
ActorSystem是Actor的管理系統,也是外部調用API的主要入口,提供主要功能:創建Actor、發送消息、休眠Actor以及網路通信等。初始化ActorSystem分為以下三步:調用conf方法讀取集群配置,包括每個Node的name和address;調用bindNode方法綁定當前Node;調用start方法初始化自身,包括對定時器的初始化和Netty服務端的初始化。
創建Actor調用newActor方法,指定要創建的Actor具體類和Actor name,Actor name需Node內部唯一。創建Actor時,先綁定當前Node,調用Actor的start方法初始化,然後將name與Actor的映射關系加入到actors中。
發送消息的核心是send方法,指定目標Node name、目標Actor name、命令名和參數後發送消息,也可以把這些信息封裝在Message中發出。消息的來源Node和來源Actor保存在一個ThreadLocal變數currThreadActor中,它在Actor創建時,將Actor線程與Actor綁定在一起,使得在調用send方法發送消息時,無需再顯式指定來源Node和來源Actor。
當消息的目標Node與來源Node相同,直接找到對應的Actor添加消息;否則,需要通過網路通信。網路通信實際上是一個簡單的RPC通信,此處使用了Netty的ObjectEncoder和ObjectDecoder進行消息的序列化和反序列化。
休眠Actor調用sleep方法實現,它制定了需要休眠的毫秒數,休眠完後回調的命令及參數。這里的sleep方法底層通過定時任務實現,添加一個TimerTask封裝過期時間和回調命令及參數,待任務到期後將命令封裝成Message發送給當前Actor自身。
定時器在Timer類中實現,它在start方法中啟動一個線程不斷輪詢處理定時任務,並提供addTimeTask方法添加新的定時任務。Timer使用優先順序隊列作為存儲定時任務的數據結構,插入任務時能達到O(logN)的時間復雜度。為性能考慮,Timer主線程非採用每隔一小段時間不斷輪詢的方式,而是在當前沒有任務需要執行時保持阻塞。
示常式序放在test包下面,涉及的類說明如下:運行時,先啟動NodeB,再啟動NodeA,NodeA下面會列印帶時間戳的信息,而NodeB下面會列印另外一系列信息,從日誌可以看出程序確實以期望的方式運行。
總結,本文詳細介紹了使用Java實現一個簡單Actor模型的完整流程。盡管本文只實現了基礎功能,但目的是為了深入掌握Actor模型的核心概念,作為演示和研究的用途。對於並發模型來說,原理才是主要的、相通的,語言只不過是實現的工具。相信本文也能幫助讀者對Actor模型有更深入的了解。
Ⅱ 面向對象的語言主要有哪些
1、java。
Java是一種廣泛使用的計算機編程語言,擁有跨平台、面向對象、泛型編程的特性,廣泛應用於企業級Web應用開發和移動應用開發。
Java編程語言的風格十分接近C++語言。繼承了C++語言面向對象技術的核心,舍棄了容易引起錯誤的指針,以引用取代;移除了C++中的運算符重載和多重繼承特性,用介面取代;增加垃圾回收器功能。
2、c++。
C++是一種使用廣泛的計算機程序設計語言。它是一種通用程序設計語言,支持多重編程模式,例如過程化程序設計、數據抽象、面向對象程序設計、泛型程序設計和設計模式等。
3、c#。
C#是微軟推出的一種基於.NET框架的、面向對象的高級編程語言。C#以.NET框架類庫作為基礎,擁有類似Visual Basic的快速開發能力。
C#由安德斯·海爾斯伯格主持開發,微軟在2000年發布了這種語言,希望藉助這種語言來取代Java。C#已經成為Ecma國際和國際標准組織的標准規范。
4、python 。
Python是一種面向對象的動態類型語言,它是解釋型、高級編程、通用型編程語言,由吉多·范羅蘇姆創造,第一版發布於1991年。
python相比於C++或Java,Python讓開發者能夠用更少的代碼表達想法。不管是小型還是大型程序,該語言都試圖讓程序的結構清晰明了。
5、golang。
Go(又稱Golang)是Google開發的一種面向對象的靜態強類型、編譯型、並發型,並具有垃圾回收功能的編程語言。
Go的語法接近C語言,但對於變數的聲明有所不同。Go支持垃圾回收功能。Go的並行模型採取類似模型的其他語言包括Occam和Limbo,但它也具有Pi運算的特徵,比如通道傳輸。在1.8版本中開放插件(Plugin)的支持,這意味著現在能從Go中動態載入部分函數。
與C++相比,Go並不包括如枚舉、異常處理、繼承、泛型、斷言、虛函數等功能,但增加了 切片(Slice) 型、並發、管道、垃圾回收、介面(Interface)等特性的語言級支持。