多线程的互斥与同步
题目:在一家抠门的公司,办公室里有三个员工,小李,小王,小刘,一个马桶,在一个美丽的工作日早晨,由于三个人去了昨晚老板请的饭局,都在闹肚子,需要上厕所,考虑到同事们的冷漠(不会递纸给你),所以上厕所前需要保证纸张数目的够用,如果不够用,需要在进入厕所前提前去老板办公室拿纸。
根据公司量身定制的纸张需求数:
小李:10张
小王:12张
小刘:13张
马桶旁目前有25张纸,请合理模拟这个美丽的工作日早晨发生的情景。
public class Emp {
private String name;
private int paper;
public Emp(String name, int paper) {
this.name = name;
this.paper = paper;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPaper() {
return paper;
}
public void setPaper(int paper) {
this.paper = paper;
}
}
import java.util.HashMap;
import java.util.Map;
public class Tolite implements Runnable{
private int paper;
public Map map = new HashMap();
public Tolite(int paper) {
this.paper = paper;
}
public int getPaper() {
return paper;
}
public void setPaper(int paper) {
this.paper = paper;
}
@Override
synchronized public void run() {
int need = (int)map.get(Thread.currentThread().getName());
if(paper - need >= 0){
paper -= need;
System.out.println("我是" + Thread.currentThread().getName() + ",我很舒爽,还剩"+paper+"张纸!");
}else{
System.out.println("我是" + Thread.currentThread().getName() + ",老板,纸又不够了!");
}
}
}
public class TestTolite {
public static void main(String[] args) {
Emp li = new Emp("小李",10);
Emp wang = new Emp("小王",12);
Emp liu = new Emp("小刘",13);
List<Emp> emp = new ArrayList();
List<Thread> threads = new ArrayList();
emp.add(li);
emp.add(wang);
emp.add(liu);
Tolite myTolite = new Tolite(25);
for (Emp e : emp) {
threads.add(new Thread(myTolite,e.getName()));
myTolite.map.put(e.getName(),e.getPaper());
}
for (Thread thread:threads) {
thread.start();
}
}
}