Java高并發(fā)程序設(shè)計(jì)—Akka

注:其一、本文章為作者讀完《實(shí)戰(zhàn)Java高并發(fā)程序設(shè)計(jì)》之后所總結(jié)的知識(shí),其中涵蓋了每一章節(jié)的精髓之處毁兆。其二、文章中一部分代碼直接引自書(shū)中次询。

使用Akka構(gòu)建高并發(fā)程序設(shè)計(jì)

1.1.新并發(fā)模型:Actor

在并發(fā)程序中荧恍,線(xiàn)程始終是并發(fā)程序的基本執(zhí)行單元。但是在Akka中屯吊,你將會(huì)使用一個(gè)全新的執(zhí)行單元—Actor送巡,而不再需要線(xiàn)程的概念。

在Actor模型中盒卸,我們不在需要調(diào)用對(duì)象(例如Actor)的方法去執(zhí)行一些業(yè)務(wù)邏輯代碼骗爆,而是通過(guò)給Actor發(fā)送一條消息。Actor接收到消息之后蔽介,它會(huì)根據(jù)消息的內(nèi)容做出一些行為摘投,包括改變自身的狀態(tài)(自發(fā)式進(jìn)行)

1.2.Akka之HelloWorld

第一個(gè)Actor實(shí)現(xiàn)

public class Greeter extends UntypedActor {

    public static enum Msg{
        GERRT, DONE;                   //消息類(lèi)型
    }

    @Override
    public void onReceive(Object msg){
        if(msg == Msg.GERRT){
            System.out.println("Hello World!");
            getSender().tell(Msg.DONE, getSelf());
        } else {
            unhandled(msg);
        }
    }

}

以上代碼定義了一個(gè)歡迎者(Greeter)Actor,它繼承自UntypedActor(Akka的核心成員)虹蓄。

  • UntypedActor:為無(wú)類(lèi)型的Actor犀呼,繼承UntypedActor之后就不能再繼承系統(tǒng)中其他類(lèi)型的構(gòu)造
  • 有類(lèi)型的Actor:可以使用系統(tǒng)中其他類(lèi)型的構(gòu)造,從而緩解Java單繼承的問(wèn)題

與Actor交流的另外一個(gè)Actor是HelloWorld薇组,他的實(shí)現(xiàn)如下:

public class HelloWorld extends UntypedActor {

    ActorRef greeter;

    //Akka的回調(diào)方法外臂,在Actor啟動(dòng)前由Akka調(diào)用完成一些初始化操作
    @Override
    public void preStart() {            
        //創(chuàng)建Greeter實(shí)例
        greeter = getContext().actorOf(Props.create(Greeter.class),"greeter");      
        System.out.println("Greeter Actor Path:" + greeter.path());
        //向Greeter發(fā)送GREET信息
        greeter.tell(Greeter.Msg.GERRT,getSelf());                 
    }

    //onReceive()函數(shù)為HelloWorld的消息處理函數(shù)。這里只處理了DONE消息律胀,然后向Greeter發(fā)送了一條GREET信息
    //因此宋光,Greeter會(huì)收到前后兩條GREET消息貌矿,打印兩次Hello World“”
    @Override
    public void onReceive(Object msg) throws Exception {           
        if(msg == Greeter.Msg.DONE) {
            greeter.tell(Greeter.Msg.GERRT, getSelf());
            getContext().stop(getSelf());
        } else {
            unhandled(msg);
        }
    }

}

主函數(shù)main():

public class HelloMainSimple {

    public static  void main(String[] args) {
        ActorSystem system = ActorSystem.create("Hello", ConfigFactory.load("samplehello.conf"));
        ActorRef a = system.actorOf(Props.create(HelloWorld.class),"helloworld");
        System.out.println("HelloWorld Actor Path:" + a.path());
    }

}
  • ActorSystem : 表示管理和維護(hù)Actor的系統(tǒng),一般一個(gè)應(yīng)用只需要一個(gè)ActorSystem 就夠了罪佳。
  • ActorSystem.creat("Hello", ConfigFactory.load("samplehello.conf")):第一個(gè)參數(shù)表示系統(tǒng)名稱(chēng)逛漫,第二個(gè)參數(shù)為配置文件。此處samplehello.conf文件的內(nèi)容為:
akka {
    loglevel = INFO
}

1.?.消息路由

public class WatchActor extends UntypedActor {

    private final LoggingAdapter log = Logging.getLogger(getContext().system(), this);

    public Router router;
    {
        List<Routee> routees = new ArrayList<Routee>();
        for(int i=0; i<5; i++) {
            ActorRef worker = getContext().actorOf(Props.create(MyWorker.class),"worker_"+i);
            getContext().watch(worker);
            routees.add(new ActorRefRoutee(worker));
        }
        router = new Router(new RoundRobinRoutingLogic(),routees);
    }

    @Override
    public void onReceive(Object msg) {
        if(msg instanceof MyWorker.Msg) {
            router.route(msg, getSender());
        } else if (msg instanceof Terminated) {
            router = router.removeRoutee(((Terminated) msg).actor());
            System.out.println(((Terminated) msg).actor().path() + " is closed,routees=" + router.routees().size());
            if(router.routees().size() == 0) {
                System.out.println("Close system");
                RouteMain.flag.send(false);
                getContext().system().shutdown();
            }
        } else {
            unhandled(msg);
        }
    }

}
public class RouteMain {

    public static Agent<Boolean> flag = Agent.create(true, ExecutionContexts.global());

    public static void main(String[] args) throws InterruptedException {
        ActorSystem system = ActorSystem.create("route", ConfigFactory.load("samplehello.conf"));
        ActorRef w = system.actorOf(Props.create(WatchActor.class), "watcher");
        int i = 1;
        while(flag.get()) {
            w.tell(MyWorker.Msg.CLOSE, ActorRef.noSender());
            i++;
            Thread.sleep(100);
        }
    }

}

文集推薦:

Java基礎(chǔ)方法集1
Python基礎(chǔ)知識(shí)完整版
Spring Boot學(xué)習(xí)筆記
Linux指令進(jìn)階
Java高并發(fā)編程
SpringMVC基礎(chǔ)知識(shí)進(jìn)階
Mysql基礎(chǔ)知識(shí)完整版
健康管理系統(tǒng)學(xué)習(xí)花絮(學(xué)習(xí)記錄)
Node.js基礎(chǔ)知識(shí)(隨手筆記)
MongoDB基礎(chǔ)知識(shí)
Dubbo學(xué)習(xí)筆記
Vue學(xué)習(xí)筆記(隨手筆記)

聲明:發(fā)表此文是出于傳遞更多信息之目的赘艳。若有來(lái)源標(biāo)注錯(cuò)誤或侵犯了您的合法權(quán)益酌毡,請(qǐng)作者持權(quán)屬證明與本我們(QQ:981086665;郵箱:981086665@qq.com)聯(lián)系聯(lián)系蕾管,我們將及時(shí)更正阔馋、刪除,謝謝娇掏。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市勋眯,隨后出現(xiàn)的幾起案子婴梧,更是在濱河造成了極大的恐慌,老刑警劉巖客蹋,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件塞蹭,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡讶坯,警方通過(guò)查閱死者的電腦和手機(jī)番电,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)辆琅,“玉大人漱办,你說(shuō)我怎么就攤上這事⊥裱蹋” “怎么了娩井?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)似袁。 經(jīng)常有香客問(wèn)我洞辣,道長(zhǎng),這世上最難降的妖魔是什么昙衅? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任扬霜,我火速辦了婚禮,結(jié)果婚禮上而涉,老公的妹妹穿的比我還像新娘著瓶。我一直安慰自己,他們只是感情好婴谱,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布蟹但。 她就那樣靜靜地躺著躯泰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪华糖。 梳的紋絲不亂的頭發(fā)上麦向,一...
    開(kāi)封第一講書(shū)人閱讀 52,158評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音客叉,去河邊找鬼诵竭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛兼搏,可吹牛的內(nèi)容都是我干的卵慰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼佛呻,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼裳朋!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起吓著,我...
    開(kāi)封第一講書(shū)人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鲤嫡,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后绑莺,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體暖眼,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年纺裁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了诫肠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡欺缘,死狀恐怖栋豫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情浪南,我是刑警寧澤笼才,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站络凿,受9級(jí)特大地震影響骡送,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜絮记,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一摔踱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧怨愤,春花似錦派敷、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)腐芍。三九已至,卻和暖如春试躏,著一層夾襖步出監(jiān)牢的瞬間猪勇,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工颠蕴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留泣刹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓犀被,卻偏偏與公主長(zhǎng)得像椅您,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子寡键,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 持久化 當(dāng)我們?cè)诩合到y(tǒng)中掀泳,一臺(tái)機(jī)器向另一臺(tái)機(jī)器發(fā)送一段數(shù)據(jù),負(fù)責(zé)接收的機(jī)器在接收數(shù)據(jù)前突然宕機(jī)西轩,就會(huì)造成數(shù)據(jù)丟失...
    mango_knight閱讀 4,544評(píng)論 0 4
  • Actor系統(tǒng)的實(shí)體 在Actor系統(tǒng)中开伏,actor之間具有樹(shù)形的監(jiān)管結(jié)構(gòu),并且actor可以跨多個(gè)網(wǎng)絡(luò)節(jié)點(diǎn)進(jìn)行透...
    JasonDing閱讀 3,344評(píng)論 2 6
  • 摘要 也許您已經(jīng)聽(tīng)說(shuō)過(guò)Akka遭商,一種用于建造可伸縮,彈性且高效應(yīng)用程序的工具包捅伤,支持Java和Scala編程語(yǔ)言劫流。...
    wolfwolfgod閱讀 1,587評(píng)論 0 3
  • Actor的創(chuàng)建&引用&聲明周期 1.創(chuàng)建actor 定義一個(gè)Actor類(lèi) 要定義自己的Actor類(lèi),需要繼承Ac...
    這個(gè)該叫什么呢閱讀 1,015評(píng)論 0 1
  • 親愛(ài)的丛忆,我愛(ài)你祠汇, 任何時(shí)候我都在, 愛(ài)你熄诡,與你一起可很; 不論你想做什么,我都相信你凰浮, 不論你想說(shuō)什么我抠,都是最好的表達(dá)...
    歐陽(yáng)赫瞳閱讀 5,346評(píng)論 77 149