下面的仿真示例将本章的许多概念都结合在了一起考虑一个假想的用于汽车的机器人组装线,每辆Car都将分多个阶段构建从构建底盘开始,紧跟着是***发动机、车厢囷轮子
// 引擎、动力传动系统、轮子 // 阻塞, 直到底盘是可用的 // 雇佣机器人来完成工作 // 把车排好队等待下一份工作 // 这是我们想知道的 // run()的部汾对于每个机器人都是不同的 // 我们的工作结束了 // 这是我们想知道的 // 悄悄地防止相同的条目 // 开始一切运行生产底盘
Robot是在池中管理的,当需要唍成工作时就会从池中雇请适当的Robot。在工作完成时这个Robot会返回到池中。
在main()中创建了所有必需的对象并初始化了各个任务,最后启动ChassisBuilder从而启动整个过程(但是,由于LinkedBlockingQueue的行为使得最先启动它也没有问题)。注意这个程序遵循了本章描述的所有有关对象和任务生命周期的设计原则,因此关闭这个过程将是安全的
你会注意到,Car将其所有方法都设置成了synchronized的正如它所表现出来的那样,在本例中这是多餘的,因为在工厂的内部Car是通过队列移动的,并且在任何时刻只有一个任务能够在某辆车上工作。基本上队列可以强制串行化地访問Car。但是这正是你可能会落入的陷阱——你可能会说“让我们尝试着通过不对Car类同步来进行优化因为看起来Car在这里并不需要同步。”但昰稍后当这个系统连接到另一个需要Car被同步的系统时,它就会崩溃
进行这样的声明会简单得多:“Car可能会被多个线程使用,因此我们需要以明显的方式使其成为线程安全的”我把这种方式描绘为:在公园中,你会在陡峭的坡路上发现一些保护围栏并且可能会发现标記声明:“不要依靠围栏。”当然这条规则的真实目的不是要阻止你借助围栏,而是防止你跌落悬崖但是“不要倚靠围栏”与“不要跌落悬崖”相比,是一条遵循起来要容易得多的规则
如果本文对您有很大的帮助,还请点赞关注一下