角色和进程
这个地方读的有点难了,这方面以前没有接触过,文章里面的例子也只是看懂了一个大概,主要是里面有很多函数的声明没有看到,不知道是不是js自带的。
里面说角色模型需要满足几个要求:
- 没有一件事是可控的。信息从原始数据到最终输出的过程无法统筹安排
- 系统中唯一的状态,保存在消息和每个角色的状态中
- 所有的消息都是单向的,没有回应这个概念
- 角色一次只会处理一条消息,但是会把所有的消息都处理完
第一点我不是很理解要表达什么意思,后面几点的描述中,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类的工作等等。
这个例子也有点生产者消费者的样子了,具体黑板的使用场景可能在项目里使用不起来。
网友评论