50,530
社区成员
发帖
与我相关
我的任务
分享
import java.util.ArrayList;
import java.util.List;
public class MultiSight {
public static void main(String[] args) throws InterruptedException {
// 2个管理员启动
Governor gov1 = new Governor("管理员A");
Governor gov2 = new Governor("管理员B");
new Thread(gov1).start();
new Thread(gov2).start();
// 过了5秒,开始来人
Thread.sleep(5000);
// 每隔管理员增加5个观光者
int i = 0;
for (; i < 5; i++) {
new Visitor("观光者A队" + i, gov1);
new Visitor("观光者B队" + i, gov2);
}
// 过了10秒又来一波顾客
Thread.sleep(10000);
for (; i < 10; i++) {
new Visitor("观光者A队" + i, gov1);
new Visitor("观光者B队" + i, gov2);
}
}
}
/**
* 景点管理员
*/
class Governor implements Runnable {
// 管理员姓名
private String name;
// 管理员当前负责的观光者
private List<Visitor> visitorList = new ArrayList<Visitor>();
public Governor(String name) {
this.name = name;
}
@Override
public void run() {
// 管理员一直在看游客数量
for (;;) {
// 有人了!
if (visitorList.size() > 0) {
System.out.println(name + "说:终于来人了!");
// 让第一个人玩
visitorList.get(0).play();
// 玩完了让他离开
visitorList.remove(0);
// 这里的remove暂时没有考虑同步,可以单独将所有的List操作增加同步关键字
}
}
}
// 顾客来了!
public synchronized void comeIn(Visitor visitor) {
System.out.println(name + "说:顾客" + visitor.getName() + "来了!");
visitorList.add(visitor);
}
}
/**
* 观光者
*/
class Visitor {
private String name;
// 一个观光者来了,加入一个景点管理员
public Visitor(String name, Governor governor) {
this.name = name;
governor.comeIn(this);
}
// 顾客来了,玩一会儿...
public void play() {
System.out.println(name + "开始玩了...");
// 假设玩了1秒
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name + "玩好了!");
}
public String getName() {
return name;
}
}