zoukankan      html  css  js  c++  java
  • Active Objects模式

    实现的思路是,通过代理将方法的调用转变为向阻塞队列中添加一个请求,由一个线程取出请求后执行实际的方法,然后将结果设置到Future中

    这里用到了代理模式,Future模式

    /**************************************
     * 接受异步消息的主动对象
     * 
     **/
    public interface ActiveObject {
    
        Result makeString(int count,char fillChar);
    
        void displayString(String text);
    }
    /*
     * 主动对象的实现类
     * 
     */
    class Servant implements ActiveObject {
    
        @Override
        public Result makeString(int count, char fillChar) {
            char[] buf = new char[count];
            for (int i = 0; i < count; i++) {
                buf[i] = fillChar;
            }
            try {
                Thread.sleep(3000);
            } catch (Exception e) {
    
            }
            return new RealResult(new String(buf));
        }
    
        @Override
        public void displayString(String text) {
            try {
                Thread.sleep(2000);
                System.out.println("Display:" + text);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    /**
     * 主动对象的代理类
     *
     */
    class ActiveObjectProxy implements ActiveObject {
    
        private final SchedulerThread schedulerThread;
    
        private final Servant servant;
    
        public ActiveObjectProxy(SchedulerThread schedulerThread, Servant servant) {
            this.schedulerThread = schedulerThread;
            this.servant = servant;
        }
    
        @Override
        public Result makeString(int count, char fillChar) {
            FutureResult future = new FutureResult();
            //往队列里添加调用请求MethodRequest
            schedulerThread.invoke(new MakeStringRequest(servant, future, count, fillChar));
            return future;
        }
    
        @Override
        public void displayString(String text) {
            schedulerThread.invoke(new DisplayStringRequest(servant, text));
        }
    }
    /**
     * 工具类
     */
    public final class ActiveObjectFactory {
    
        private ActiveObjectFactory() {
        }
    
        public static ActiveObject createActiveObject() {
            Servant servant = new Servant();
            ActivationQueue queue = new ActivationQueue();
            SchedulerThread schedulerThread = new SchedulerThread(queue);
            ActiveObjectProxy proxy = new ActiveObjectProxy(schedulerThread,servant);
            schedulerThread.start();
            return proxy;
        }
    }
    /**
     * 
     *  调度者,从队列里取出任务并执行
     *  
     */
    public class SchedulerThread extends Thread {
    
        private final ActivationQueue activationQueue;
    
        public SchedulerThread(ActivationQueue  activationQueue) {
            this.activationQueue = activationQueue;
        }
    
        public void invoke(MethodRequest request) {
            this.activationQueue.put(request);
        }
    
        @Override
        public void run() {
            while (true) {
                activationQueue.take().execute();
            }
        }
    }
    /***
     * 阻塞队列
     */
    public class ActivationQueue {
    
        private final static int DEFAULT_SIZE = 100;
    
        private final LinkedList<MethodRequest> methodQueue;
    
        public ActivationQueue() {
            methodQueue = new LinkedList<>();
        }
    
        public synchronized void put(MethodRequest request) {
            while (methodQueue.size() >= DEFAULT_SIZE) {
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            this.methodQueue.addLast(request);
            this.notifyAll();
        }
    
        public synchronized MethodRequest take() {
            while (methodQueue.isEmpty()) {
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            MethodRequest methodRequest = methodQueue.removeFirst();
            this.notifyAll();
            return methodRequest;
        }
    }
    /**
     * 返回结果
     *
     */
    public interface Result {
    
        Object getResultValue();
    
    }
    /**
     * 返回的对象
     */
    public class RealResult implements Result {
    
        private final Object resultValue;
    
        public RealResult(Object resultValue) {
            this.resultValue = resultValue;
        }
    
        @Override
        public Object getResultValue() {
            return this.resultValue;
        }
    }
    /**
     * 
     * 实际返回给客户的result
     *
     */
    public class FutureResult implements Result {
    
        private Result result;
    
        private boolean ready = false;
    
        public synchronized void setResult(Result result) {
            this.result = result;
            this.ready = true;
            this.notifyAll();
        }
    
        @Override
        public synchronized Object getResultValue() {
            while (!ready) {
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return this.result.getResultValue();
        }
    }
    /**
     * 调用请求
     */
    public abstract class MethodRequest {
    
        protected final Servant servant;
    
        protected final FutureResult futureResult;
    
        public MethodRequest(Servant servant, FutureResult futureResult) {
            this.servant = servant;
            this.futureResult = futureResult;
        }
    
        public abstract void execute();
    }
    /**
     * 
     *  拼接字符
     */
    public class MakeStringRequest extends MethodRequest {
    
        private final int count;
        private final char fillChar;
    
        public MakeStringRequest(Servant servant, FutureResult futureResult, int count, char fillChar) {
            super(servant, futureResult);
            this.fillChar = fillChar;
            this.count = count;
        }
    
        @Override
        public void execute() {
            Result result = servant.makeString(count, fillChar);
            futureResult.setResult(result);
        }
    }
    /**
     * 打印字符串
     *
     */
    public class DisplayStringRequest extends MethodRequest {
    
        private final String text;
    
        public DisplayStringRequest(Servant servant, final String text) {
            super(servant, null);
            this.text = text;
        }
    
        @Override
        public void execute() {
            this.servant.displayString(text);
        }
    }
    public class Test {
    
        public static void main(String[] args) {
    
            ActiveObject activeObject = ActiveObjectFactory.createActiveObject();
            activeObject.displayString("VVVVVVVVVV");
            Result makeString = activeObject.makeString(7, 'A');
            System.out.println("#################");
            System.out.println(makeString.getResultValue());
            
        }
    }
  • 相关阅读:
    2. Get the codes from GIT
    1. Install Git and GitExtension
    [Git]Git的常用命令
    测试用例Excel模板For Quality Center
    测试用例excel模板
    如何在win 2008 server和win 7上add web site
    Jmeter运行过程中如何让Fiddler同时可以抓获到服务器的应答报文
    Windows系统文件mshtml.dll
    Jmeter中的XPath Assertion
    AIM Tech Round (Div. 2) B
  • 原文地址:https://www.cnblogs.com/moris5013/p/10919502.html
Copyright © 2011-2022 走看看