軟件首頁(yè) |  文章首頁(yè)
最新更新 軟件分類(lèi) 設(shè)為首頁(yè) 加入收藏 聯(lián)系我們
當(dāng)前位置:首頁(yè)文章首頁(yè) IT學(xué)院 Java

多線程開(kāi)發(fā)的捷徑:構(gòu)建Java并發(fā)模型框架

作者:東坡下載  來(lái)源:uzzf  發(fā)布時(shí)間:2010-10-14 12:04:04  點(diǎn)擊:

  14.            try {

  15.                   wait();

  16.            }catch (InterruptedException e) {

  17.                   e.printStackTrace();

  18.            }

  19.        }

  20.

  21.        _queue.push(mr);

  22.        notifyAll();

  23.        System.out.println("Leave Queue");

  24.    }

  25.    public synchronized MethodRequest dequeue() {

  26.        MethodRequest mr;

  27.

  28.        while(_queue.empty()) {

  29.            try {

  30.                wait();

  31.            }catch (InterruptedException e) {

  32.                e.printStackTrace();

  33.            }

  34.        }

  35.        mr = (MethodRequest)_queue.pop();

  36.        notifyAll();

  37.

  38. return mr;

  39.    }

  40.    private Stack _queue;

  41.    private final static int QUEUE_SIZE = 20;

  42.}

  43.//ActiveObject的定義

  44.class ActiveObject extends Thread

  45.{

  46.    public ActiveObject() {

  47.        _queue = new ActiveQueue();

  48.        start();

  49.    }

  50.    public void enqueue(MethodRequest mr) {

  51.        _queue.enqueue(mr);

  52.    }

  53.    public void run() {

  54.        while(true) {

  55.            MethodRequest mr = _queue.dequeue();

  56.            mr.call();

  57.        }

  58.    }

  59.    private ActiveQueue _queue;

  60.}

  通過(guò)上面的代碼可以看出正是這些類(lèi)相互合作完成了對(duì)并發(fā)邏輯的封裝。開(kāi)發(fā)者只需要根據(jù)需要實(shí)現(xiàn)MethodRequest接口,另外再定義一個(gè)服務(wù)代理類(lèi)提供給使用者,在服務(wù)代理者類(lèi)中把服務(wù)調(diào)用者的請(qǐng)求轉(zhuǎn)化為MethodRequest實(shí)現(xiàn),交給活動(dòng)對(duì)象即可。

  使用該框架,可以較好的做到應(yīng)用邏輯和并發(fā)模型的分離,從而使開(kāi)發(fā)者集中精力于應(yīng)用領(lǐng)域,然后平滑的和并發(fā)模型結(jié)合起來(lái),并且可以針對(duì)ActiveQueue定制排隊(duì)機(jī)制,比如基于優(yōu)先級(jí)等。

基于框架的解決方案

  本小節(jié)將使用上述的框架重新實(shí)現(xiàn)前面的例子,提供對(duì)于并發(fā)的支持。第一步先完成對(duì)于MethodRequest的實(shí)現(xiàn),對(duì)于我們的例子來(lái)說(shuō)實(shí)現(xiàn)如下:

  1.class SayHello implements MethodRequest

  2.{

  3.    public SayHello(Service s) {

  4.        _service = s;

  5.    }

  6.    public void call() {

  7.        _service.sayHello();

  8.    }

  9.    private Service _service;

  10.}

  該類(lèi)完成了對(duì)于服務(wù)提供接口sayHello方法的封裝。接下來(lái)定義一個(gè)服務(wù)代理類(lèi),來(lái)完成請(qǐng)求的封裝、排隊(duì)功能,當(dāng)然為了做到對(duì)Client透明,該類(lèi)必須實(shí)現(xiàn)Service接口。定義如下:

  11.class ServiceProxy implements Service

  12.{

  13.    public ServiceProxy() {

  14.        _service = new ServiceImp();

  15.        _active_object = new ActiveObject();

  16.    }

  17.

  18.    public void sayHello() {

  19.        MethodRequest mr = new SayHello(_service);

  20.        _active_object.enqueue(mr);

  21.    }

  22.    private Service _service;

  23.    private ActiveObject _active_object;

  24.}

  其他的類(lèi)和接口定義不變,下面對(duì)比一下并發(fā)邏輯增加前后的服務(wù)調(diào)用的變化,并發(fā)邏輯增加前,對(duì)于sayHello服務(wù)的調(diào)用方法:

  25.Service s = new ServiceImp();

  26.Client c = new Client(s);

  27.c.requestService();

  并發(fā)邏輯增加后,對(duì)于sayHello服務(wù)的調(diào)用方法:

  28.Service s = new  ServiceProxy();

  29.Client c = new Client(s);

  30.c.requestService();

  可以看出并發(fā)邏輯增加前后對(duì)于Client的ServiceImp都無(wú)需作任何改變,使用方式也非常一致,ServiceImp也能夠獨(dú)立的進(jìn)行重用。類(lèi)結(jié)構(gòu)圖如下:

類(lèi)結(jié)構(gòu)圖

文章評(píng)論

欄目導(dǎo)航

本類(lèi)推薦文章

關(guān)于本站 | 網(wǎng)站幫助 | 廣告合作 | 下載聲明 | 友情連接 | 網(wǎng)站地圖
Copyright © 20098-2010 uzzf下載站. All Rights Reserved .