2018-04-03 java并发编程第三次作业总结

2018-04-05  本文已影响0人  blockchainer

题目概述: 题目要求实现一个消息类, 一个网络类, 模拟网络中的路由器收发包。 网络里有router, 也就是路由器, 他有相关的路由算法, 题目有给出包依据怎样的方式路由, 需要用代码实现。 有core, core是router里的核心, 每个router既能接收消息, 也能发送消息。 core里面有一个队列, 用来专门接收消息, 另一个队列用来存放待发送的消息, core也可以自己生成消息。每个router还有4个port, 分别是东南西北四个方向的端口, 端口里要有数据结构可以存放消息, 因为消息在传递过程中会暂时存放在端口中。 最后还有一个wire类,wire是用来连接两个router的端口的。题目要求实现里面提到的所有类, 然后实现两个多线程的simulator。 题目提供了sequential 的simulator。simulator就是用来新建网络,产生消息然后模拟消息接受发送的类。 第一个多线程是naive simulator, 第二个是exec simulator。 naive的simulator是一个线程执行一个task(路由任务)。 exec是一个线程可以一下执行多个task。 最后需要比较三种simulator在不同变量影响下的执行速度。

难点:首先 得理清这个作业模拟的场景, 然后是对于题目中给出的路由规则的理解, 明白每一个对象的功能。 逻辑概念清晰后, 对于实现有很大帮助。路由规则一共有6个。这是这个项目里最复杂也是最容易出bug的地方。因为不管怎么样测试消息转发时消息都会使用到route()这个方法。 其余的方法教授都有给出api, 照着api上的要求去实现, 大部分方法都没有问题。

其次, 写naive simulator和exec simulator时, 一开始无从下手。 但是参考了sequential simulator之后, 又结合future类的使用, 将问题得以解决。 不同的是在提交任务时, naive simulator是每次提交一个任务给一个线程, exec simulator 是一次提交多个任务给一个线程。 提交了任务之后需要利用future类里的get()方法等待所有的提交任务执行完, 再进行下一步操作。 先提交所有route(), 再提交所有wire(), 最后提交所有core(). (为什么要这样其实还不是很清楚, 这个流程是仿照教授给出的sequential simulator写的)。 这次作业其实没太用到并发编程的东西, 除了一些数据结构和在一个地方用了automicInteger以外,没有用到太多线程安全的东西(其实前面说的那些地方都可以不用线程安全的数据结构, 完全不影响作业)之所以能做到这点是因为后来发现老师设计的这个作业的模式有效避免了race condition的发生(在route规则里)。

上一篇下一篇

猜你喜欢

热点阅读