场景:公司有若干部门,每个部门一个厕所,每个部门的员工争抢本部门的厕所
import java.util.Map;
import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;
public class ToiletTester {
private static final int personNum = 30;
public static Map<Integer, Toilet> DepToilets = new ConcurrentHashMap<>();
public static void main(String[] args) {
for (int i = 1; i <= personNum; i++) {
int depId = randomRange(5, 1);
String empName = fixedLengthFill0(3, i) + " 号员工";
Person person = new Person(depId, empName);
person.start();
}
}
public static Integer randomRange(int max, int min) {
return new Random().nextInt(max)%(max-min+1) + min;
}
private static String fixedLengthFill0(int length, int seq) {
StringBuilder strBu = new StringBuilder();
int fillLen = length - String.valueOf(seq).length();
for (int i = 0; i < fillLen; i++) {
strBu.append("0");
}
strBu.append(seq);
return strBu.toString();
}
}
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Toilet {
private Integer depId;
private Lock lock = new ReentrantLock(true);
public Toilet(Integer depId) {
this.depId = depId;
}
public void enter() {
try {
lock.lock();
System.out.println(Thread.currentThread().getName() + "获得Toilet-DEP"+depId+" 使用权,time:" + System.currentTimeMillis());
int sec = ToiletTester.randomRange(3, 1);
Thread.sleep(sec * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public Integer getDepId() {
return depId;
}
public void setDepId(Integer depId) {
this.depId = depId;
}
public Lock getLock() {
return lock;
}
}
public class Person extends Thread{
private Integer depId;
private String empName;
public Person(Integer depId, String empName) {
this.setName("DEP" + depId + "-" + empName);
this.depId = depId;
this.empName = empName;
}
@Override
public void run() {
ToiletTester.DepToilets.putIfAbsent(depId, new Toilet(depId));
Toilet toilet = ToiletTester.DepToilets.get(depId);
toilet.enter();
super.run();
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public Integer getDepId() {
return depId;
}
public void setDepId(Integer depId) {
this.depId = depId;
}
}