美文网首页
程序员修炼之道34/35-角色和进程+黑板

程序员修炼之道34/35-角色和进程+黑板

作者: DZQANN | 来源:发表于2022-02-28 22:06 被阅读0次

    角色和进程

    这个地方读的有点难了,这方面以前没有接触过,文章里面的例子也只是看懂了一个大概,主要是里面有很多函数的声明没有看到,不知道是不是js自带的。

    里面说角色模型需要满足几个要求:

    1. 没有一件事是可控的。信息从原始数据到最终输出的过程无法统筹安排
    2. 系统中唯一的状态,保存在消息和每个角色的状态中
    3. 所有的消息都是单向的,没有回应这个概念
    4. 角色一次只会处理一条消息,但是会把所有的消息都处理完

    第一点我不是很理解要表达什么意思,后面几点的描述中,2、3点我认为是说有一个类实现了Runnable接口,其中run方法里面只可以使用通过构造方法传进的参数,因为本身Runnable就限制了方法一定是void的,所以也不存在返回值。

    至于最后一点的一次只处理一条消息,会把所有消息都处理完,有点类似Queue。下面是代码

    public class Task implements Runnable{
        private final String name;
    
        public Task(String name) {
            this.name = name;
        }
    
        @Override
        public void run() {
            System.out.println(this.name + " is running!");
        }
    }
    
    public class ThreadPoolTest {
        private static final ThreadPoolExecutor THREADPOOL = new ThreadPoolExecutor(2, 4, 3,
                TimeUnit.SECONDS, new ArrayBlockingQueue<>(3),
                new ThreadPoolExecutor.DiscardOldestPolicy());
    
        public void run() {
            List<Task> tasks = new ArrayList<>();
            for (int i = 1; i <= 1000; i++) {
                tasks.add(new Task("task" + i));
            }
            tasks.forEach(THREADPOOL::execute);
        }
    
        public static void main(String[] args) {
            new ThreadPoolTest().run();
        }
    }
    

    这里还强调了一点说不通角色间的沟通也是通过消息的,这就类似于我们的Order或者Charge的改动会触发Change事件,我们有Queue回去接受这个事件,同时这个事件的处理逻辑中可能还会生成一个新的消息发送到其它Queue里。

    黑板

    这一节就比上一节更抽象了,搜了一下黑板模型都是百度学术里的论文。。

    像是在说这样一件事:

    有一个大的全局变量,更像是持久层的内容。里面可以存放内容并且可以按照规则检索内容,不管是何种线程存储什么样格式的内容都可以。

    非要往这上面靠的例子的话,以前写过一个爬虫,爬拉勾网。拉勾网有一级标题、二级标题和职位列表以及职位详情。

    对于这4中不同类型的网页内容,会有不同的数据提取策略,一级标题处理出来会生成二级标题的url链接列表,启动二级标题的爬虫,同时把一级标题的内容写进DB中,其它的以此类推。最后,等所有的爬虫都结束了,统计分析DB里面的数据,发现拉勾网上面大多数都是IT类的工作等等。

    这个例子也有点生产者消费者的样子了,具体黑板的使用场景可能在项目里使用不起来。

    相关文章

      网友评论

          本文标题:程序员修炼之道34/35-角色和进程+黑板

          本文链接:https://www.haomeiwen.com/subject/jevjrrtx.html