62,625
社区成员
发帖
与我相关
我的任务
分享package houlei.support.communicate;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.Semaphore;
public class CrossBridge {
private static class People{
public int id;
public RiverSide belong;
public People(int id){
this.id = id;
}
}
private static class RiverSide{
public String name;
public ConcurrentLinkedQueue<People> waiters = new ConcurrentLinkedQueue<People>();
}
private static class Bridge{
Semaphore semaphore = new Semaphore(2);
public void cross(RiverSide fromSide, People people, RiverSide toSide) throws InterruptedException{
synchronized (fromSide) {
if(!fromSide.waiters.contains(people)){
throw new IllegalArgumentException("未找到要过河的人");
}
fromSide.waiters.remove(people);
}
semaphore.acquire();
// 过河过程中,采用随机延时操作代替。
SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss.SSS");
System.out.println(format.format(new Date()) + " 有个人(id:"+people.id+")从岸边("+fromSide.name+")过和到对岸("+toSide.name+")");
Random rand = new Random();
try {
Thread.sleep(rand.nextInt(500));
} catch (InterruptedException e) {
}
System.out.println(format.format(new Date()) + " 有个人(id:"+people.id+")从岸边("+fromSide.name+")过和到对岸("+toSide.name+")");
synchronized (toSide) {
if(toSide.waiters.contains(people)){
throw new IllegalArgumentException("过河的人已经在对岸了");
}
toSide.waiters.add(people);
}
semaphore.release();
}
}
private static class CrossExecutor extends Thread{
final RiverSide from;
final Bridge bridge;
final RiverSide to;
public CrossExecutor(RiverSide from, Bridge bridge, RiverSide to) {
super();
this.from = from;
this.bridge = bridge;
this.to = to;
}
public void run(){
for(People people : from.waiters){
if(people.belong != from){
continue;
}
try {
bridge.cross(from, people, to);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) throws InterruptedException {
RiverSide sideA = new RiverSide();
sideA.name = "Side_A";
for(int i=0; i<5; i++){
People p = new People(11 + i);
p.belong = sideA;
sideA.waiters.add(p);
}
RiverSide sideB = new RiverSide();
sideB.name = "Side_B";
for(int i=0; i<5; i++){
People p = new People(21 + i);
p.belong = sideB;
sideB.waiters.add(p);
}
Bridge bridge = new Bridge();
CrossExecutor crossA2B = new CrossExecutor(sideA, bridge, sideB);
CrossExecutor crossB2A = new CrossExecutor(sideB, bridge, sideA);
crossA2B.start();
crossB2A.start();
// 等待完成
Thread.sleep(600);
}
}