这个是 java编程思想 里仿真的最后一个例子,感觉挺不错的,对学习理解并发来说挺有用的,大家可以看看,也可以在此基础上添加别的功能.package concurrency;import java.util.*;
import java.util.concurrent.*;//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
class Car {
//---------------------------------------------------
private final int id;
private boolean engine = false, driveTrain = false, wheels = false;
//---------------------------------------------------
public Car(int id) {this.id = id;}
//---------------------------------------------------
public Car() {id = -1;}
//---------------------------------------------------
public synchronized int getId() {return id;}
//---------------------------------------------------
public synchronized void addEngine() {engine = true;}
//---------------------------------------------------
public synchronized void addDriveTrain() {driveTrain = true;}
//---------------------------------------------------
public synchronized void addWheels() {wheels = true;}
//---------------------------------------------------
@Override
public synchronized String toString()
{
return "汽车" + id + " [发动机:" + (engine? "是" : "否") +
" - 传动系统:" + (driveTrain? "是" : "否") + " - 车轮:" +
(wheels? "是" : "否") + "]";
}
}//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
@SuppressWarnings("serial")
class CarQueue extends LinkedBlockingQueue<Car> {}//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
class ChassisBuilder implements Runnable {
//---------------------------------------------------
private int counter = 0;
private CarQueue carQueue;
//---------------------------------------------------
public ChassisBuilder(CarQueue q) {carQueue = q;}
//---------------------------------------------------
@Override
public void run()
{
try
{
while(!Thread.interrupted())
{
//模拟制造底盘所需的时间
TimeUnit.MILLISECONDS.sleep(500);
Car c = new Car(counter++);
System.out.println("底盘生产完成 " + c);
//将制造好的底盘放入阻塞队列中
carQueue.put(c);
}
}
catch(InterruptedException e)
{
System.out.println("底盘生产被中断");
return;
}
System.out.println("底盘生产结束");
}
}//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
class Assembler implements Runnable {
//---------------------------------------------------
private static int counter = 0;
private final int id = counter++;
private CarQueue chassisQueue, finishingQueue;
private RobotPool robotPool;
private Car car;
//该对象应用于4个任务,4个任务都到达了屏蔽点则继续
private CyclicBarrier barrier = new CyclicBarrier(4);
//---------------------------------------------------
public Assembler(CarQueue c, CarQueue f, RobotPool r)
{
chassisQueue = c;
finishingQueue = f;
robotPool = r;
}
//---------------------------------------------------
public Car car() {return car;}
//---------------------------------------------------
public CyclicBarrier barrier() {return barrier;}
//---------------------------------------------------
public String toString() {return "装配工" + id;}
//---------------------------------------------------
@Override
public void run()
{
try
{
while(!Thread.interrupted())
{
//装配工从队列中取出底盘,如果没有,在此等待
car = chassisQueue.take();
//雇佣机器人进行引擎、传动系统和车轮的组装,雇佣必须按以下顺序执行,实际装配顺序未限定
robotPool.hire(EngineRobot.class, this);
robotPool.hire(DriveTrainRobot.class, this);
robotPool.hire(WheelsRobot.class, this);
//等待其他三个任务(雇佣的相应机器人组装引擎、传动系统和车轮)到达barrier对象的屏蔽点
barrier.await();
//将装配好的汽车放入最终的队列中
finishingQueue.put(car);
}
}
catch(InterruptedException e)
{
System.out.println(this + "工作被中断");
return;
}
catch(BrokenBarrierException e)
{
System.out.println(this + "工作异常");
return;
}
System.out.println(this + "工作完成");
}
}//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
abstract class Robot implements Runnable {
//---------------------------------------------------
private RobotPool pool;
private boolean engage = false;
protected Assembler assembler;
//---------------------------------------------------
public Robot(RobotPool p) {pool = p;}
//---------------------------------------------------
protected abstract void performService();
//---------------------------------------------------
@Override
public void run()
{
try
{
//将机器人放入队列,以供装配工雇佣
powerDown();
while(!Thread.interrupted())
{
//装配指定组件
performService();
TimeUnit.SECONDS.sleep(1);
//等待其他组件装配完毕
assembler.barrier().await();
//将机器人重新放入队列,以供下次雇佣
powerDown();
}
}
catch(InterruptedException e)
{
System.out.println(this + " - 工作被中断");
return;
}
catch(BrokenBarrierException e)
{
System.out.println(this + " - 工作异常");
return;
}
System.out.println(this + " - 工作结束");
}
//---------------------------------------------------
public synchronized void engage(Assembler assembler)
{
//该机器人被指定装配工雇佣
this.assembler = assembler;
engage = true;
notifyAll();
}
//---------------------------------------------------
private synchronized void powerDown() throws InterruptedException
{
//该机器人闲置
engage = false;
assembler = null;
//将该机器人放入到机器人队列中以供装配工雇佣
pool.add(this);
//没被雇佣则在此等待,并释放该对象锁
while(engage == false) wait();
}
}//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
class EngineRobot extends Robot {
//---------------------------------------------------
private static int counter = 0;
private final int id = counter++;
//---------------------------------------------------
public EngineRobot(RobotPool p) {super(p);}
//---------------------------------------------------
@Override
public String toString()
{
return (assembler == null? "闲置的 - " : "被 - " + assembler + " - 雇佣的 - ") + "发动机装配机器人" + id;
}
//---------------------------------------------------
@Override
protected void performService()
{
System.out.println(this + " - 为 - " + assembler.car() + " - 装配发动机");
assembler.car().addEngine();
}
}//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
class DriveTrainRobot extends Robot {
//---------------------------------------------------
private static int counter = 0;
private final int id = counter++;
//---------------------------------------------------
public DriveTrainRobot(RobotPool p) {super(p);}
//---------------------------------------------------
@Override
public String toString()
{
return (assembler == null? "闲置的 - " : "被 - " + assembler + " - 雇佣的 - ") + "传动系统装配机器人" + id;
}
//---------------------------------------------------
@Override
protected void performService()
{
System.out.println(this + " - 为 - " + assembler.car() + " - 装配传动系统");
assembler.car().addDriveTrain();
}
}//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
class WheelsRobot extends Robot {
//---------------------------------------------------
private static int counter = 0;
private final int id = counter++;
//---------------------------------------------------
public WheelsRobot(RobotPool p) {super(p);}
//---------------------------------------------------
@Override
public String toString()
{
return (assembler == null? "闲置的 - " : "被 - " + assembler + " - 雇佣的 - ") + "车轮装配机器人" + id;
}
//---------------------------------------------------
@Override
protected void performService()
{
System.out.println(this + " - 为 - " + assembler.car() + " - 装配车轮");
assembler.car().addWheels();
}
}//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
class RobotPool {
//---------------------------------------------------
private Set<Robot> pool = new HashSet<Robot>();
//---------------------------------------------------
public synchronized void hire(Class<? extends Robot> robotType, Assembler a)
throws InterruptedException
{
for(Robot r : pool)
//判断队列中的机器人是否为指定类型的机器人
if(r.getClass().equals(robotType))
{
//从队列中取出指定类型机器人
pool.remove(r);
//当前装配工雇佣了指定机器人
r.engage(a);
return;
}
//没有合适的机器人可雇佣则在此等待,并释放本类(RobotPool)对象的锁
wait();
//继续判断有无可雇佣的机器人(递归调用)
hire(robotType, a);
}
//---------------------------------------------------
public synchronized void add(Robot r)
{
pool.add(r);
//唤醒调用本类对象的同步方法中阻塞于wait()方法的任务
notifyAll();
}
}//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
class Reporter implements Runnable {
//---------------------------------------------------
private CarQueue carQueue;
//---------------------------------------------------
public Reporter(CarQueue q) {carQueue = q;}
//---------------------------------------------------
@Override
public void run()
{
try
{
while(!Thread.interrupted())
{
System.out.println("\n--- " + carQueue.take() + " 装配完毕 --- \n");
}
}
catch(InterruptedException e)
{
System.out.println("检验员工作被中断");
return;
}
System.out.println("检验员工作结束");
}
}
import java.util.concurrent.*;//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
class Car {
//---------------------------------------------------
private final int id;
private boolean engine = false, driveTrain = false, wheels = false;
//---------------------------------------------------
public Car(int id) {this.id = id;}
//---------------------------------------------------
public Car() {id = -1;}
//---------------------------------------------------
public synchronized int getId() {return id;}
//---------------------------------------------------
public synchronized void addEngine() {engine = true;}
//---------------------------------------------------
public synchronized void addDriveTrain() {driveTrain = true;}
//---------------------------------------------------
public synchronized void addWheels() {wheels = true;}
//---------------------------------------------------
@Override
public synchronized String toString()
{
return "汽车" + id + " [发动机:" + (engine? "是" : "否") +
" - 传动系统:" + (driveTrain? "是" : "否") + " - 车轮:" +
(wheels? "是" : "否") + "]";
}
}//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
@SuppressWarnings("serial")
class CarQueue extends LinkedBlockingQueue<Car> {}//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
class ChassisBuilder implements Runnable {
//---------------------------------------------------
private int counter = 0;
private CarQueue carQueue;
//---------------------------------------------------
public ChassisBuilder(CarQueue q) {carQueue = q;}
//---------------------------------------------------
@Override
public void run()
{
try
{
while(!Thread.interrupted())
{
//模拟制造底盘所需的时间
TimeUnit.MILLISECONDS.sleep(500);
Car c = new Car(counter++);
System.out.println("底盘生产完成 " + c);
//将制造好的底盘放入阻塞队列中
carQueue.put(c);
}
}
catch(InterruptedException e)
{
System.out.println("底盘生产被中断");
return;
}
System.out.println("底盘生产结束");
}
}//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
class Assembler implements Runnable {
//---------------------------------------------------
private static int counter = 0;
private final int id = counter++;
private CarQueue chassisQueue, finishingQueue;
private RobotPool robotPool;
private Car car;
//该对象应用于4个任务,4个任务都到达了屏蔽点则继续
private CyclicBarrier barrier = new CyclicBarrier(4);
//---------------------------------------------------
public Assembler(CarQueue c, CarQueue f, RobotPool r)
{
chassisQueue = c;
finishingQueue = f;
robotPool = r;
}
//---------------------------------------------------
public Car car() {return car;}
//---------------------------------------------------
public CyclicBarrier barrier() {return barrier;}
//---------------------------------------------------
public String toString() {return "装配工" + id;}
//---------------------------------------------------
@Override
public void run()
{
try
{
while(!Thread.interrupted())
{
//装配工从队列中取出底盘,如果没有,在此等待
car = chassisQueue.take();
//雇佣机器人进行引擎、传动系统和车轮的组装,雇佣必须按以下顺序执行,实际装配顺序未限定
robotPool.hire(EngineRobot.class, this);
robotPool.hire(DriveTrainRobot.class, this);
robotPool.hire(WheelsRobot.class, this);
//等待其他三个任务(雇佣的相应机器人组装引擎、传动系统和车轮)到达barrier对象的屏蔽点
barrier.await();
//将装配好的汽车放入最终的队列中
finishingQueue.put(car);
}
}
catch(InterruptedException e)
{
System.out.println(this + "工作被中断");
return;
}
catch(BrokenBarrierException e)
{
System.out.println(this + "工作异常");
return;
}
System.out.println(this + "工作完成");
}
}//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
abstract class Robot implements Runnable {
//---------------------------------------------------
private RobotPool pool;
private boolean engage = false;
protected Assembler assembler;
//---------------------------------------------------
public Robot(RobotPool p) {pool = p;}
//---------------------------------------------------
protected abstract void performService();
//---------------------------------------------------
@Override
public void run()
{
try
{
//将机器人放入队列,以供装配工雇佣
powerDown();
while(!Thread.interrupted())
{
//装配指定组件
performService();
TimeUnit.SECONDS.sleep(1);
//等待其他组件装配完毕
assembler.barrier().await();
//将机器人重新放入队列,以供下次雇佣
powerDown();
}
}
catch(InterruptedException e)
{
System.out.println(this + " - 工作被中断");
return;
}
catch(BrokenBarrierException e)
{
System.out.println(this + " - 工作异常");
return;
}
System.out.println(this + " - 工作结束");
}
//---------------------------------------------------
public synchronized void engage(Assembler assembler)
{
//该机器人被指定装配工雇佣
this.assembler = assembler;
engage = true;
notifyAll();
}
//---------------------------------------------------
private synchronized void powerDown() throws InterruptedException
{
//该机器人闲置
engage = false;
assembler = null;
//将该机器人放入到机器人队列中以供装配工雇佣
pool.add(this);
//没被雇佣则在此等待,并释放该对象锁
while(engage == false) wait();
}
}//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
class EngineRobot extends Robot {
//---------------------------------------------------
private static int counter = 0;
private final int id = counter++;
//---------------------------------------------------
public EngineRobot(RobotPool p) {super(p);}
//---------------------------------------------------
@Override
public String toString()
{
return (assembler == null? "闲置的 - " : "被 - " + assembler + " - 雇佣的 - ") + "发动机装配机器人" + id;
}
//---------------------------------------------------
@Override
protected void performService()
{
System.out.println(this + " - 为 - " + assembler.car() + " - 装配发动机");
assembler.car().addEngine();
}
}//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
class DriveTrainRobot extends Robot {
//---------------------------------------------------
private static int counter = 0;
private final int id = counter++;
//---------------------------------------------------
public DriveTrainRobot(RobotPool p) {super(p);}
//---------------------------------------------------
@Override
public String toString()
{
return (assembler == null? "闲置的 - " : "被 - " + assembler + " - 雇佣的 - ") + "传动系统装配机器人" + id;
}
//---------------------------------------------------
@Override
protected void performService()
{
System.out.println(this + " - 为 - " + assembler.car() + " - 装配传动系统");
assembler.car().addDriveTrain();
}
}//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
class WheelsRobot extends Robot {
//---------------------------------------------------
private static int counter = 0;
private final int id = counter++;
//---------------------------------------------------
public WheelsRobot(RobotPool p) {super(p);}
//---------------------------------------------------
@Override
public String toString()
{
return (assembler == null? "闲置的 - " : "被 - " + assembler + " - 雇佣的 - ") + "车轮装配机器人" + id;
}
//---------------------------------------------------
@Override
protected void performService()
{
System.out.println(this + " - 为 - " + assembler.car() + " - 装配车轮");
assembler.car().addWheels();
}
}//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
class RobotPool {
//---------------------------------------------------
private Set<Robot> pool = new HashSet<Robot>();
//---------------------------------------------------
public synchronized void hire(Class<? extends Robot> robotType, Assembler a)
throws InterruptedException
{
for(Robot r : pool)
//判断队列中的机器人是否为指定类型的机器人
if(r.getClass().equals(robotType))
{
//从队列中取出指定类型机器人
pool.remove(r);
//当前装配工雇佣了指定机器人
r.engage(a);
return;
}
//没有合适的机器人可雇佣则在此等待,并释放本类(RobotPool)对象的锁
wait();
//继续判断有无可雇佣的机器人(递归调用)
hire(robotType, a);
}
//---------------------------------------------------
public synchronized void add(Robot r)
{
pool.add(r);
//唤醒调用本类对象的同步方法中阻塞于wait()方法的任务
notifyAll();
}
}//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
class Reporter implements Runnable {
//---------------------------------------------------
private CarQueue carQueue;
//---------------------------------------------------
public Reporter(CarQueue q) {carQueue = q;}
//---------------------------------------------------
@Override
public void run()
{
try
{
while(!Thread.interrupted())
{
System.out.println("\n--- " + carQueue.take() + " 装配完毕 --- \n");
}
}
catch(InterruptedException e)
{
System.out.println("检验员工作被中断");
return;
}
System.out.println("检验员工作结束");
}
}
public class CarBuilderSimulation {
//---------------------------------------------------
public static void main(String[] args) throws Exception
{
CarQueue chassisQueue = new CarQueue(), finishingQueue = new CarQueue();
RobotPool robotPool = new RobotPool();
ExecutorService exec = Executors.newCachedThreadPool();
//检验员开始工作
exec.execute(new Reporter(finishingQueue));
//底盘开始生产
exec.execute(new ChassisBuilder(chassisQueue));
//机器人开始工作
for(int i = 0; i < 5; ++i)
exec.execute(new EngineRobot(robotPool));
for(int i = 0; i < 5; ++i)
exec.execute(new DriveTrainRobot(robotPool));
for(int i = 0; i < 5; ++i)
exec.execute(new WheelsRobot(robotPool));
//装配工开始工作
for(int i = 0; i < 8; ++i)
exec.execute(new Assembler(chassisQueue, finishingQueue, robotPool)); //整个生产装配检验持续一段时间后结束
TimeUnit.SECONDS.sleep(15);
exec.shutdownNow();
//输出未装配的车辆
TimeUnit.SECONDS.sleep(1);
System.out.println("\n----------- 剩余未装配车辆: -----------");
for(Car c : chassisQueue) System.out.println(c);
}
}