多线程的互斥与同步
多线程的互斥与同步
题目:在一家抠门的公司,办公室里有三个员工,小李,小王,小刘,一个马桶,在一个美丽的工作日早晨,由于三个人去了昨晚老板请的饭局,都在闹肚子,需要上厕所,考虑到同事们的冷漠(不会递纸给你),所以上厕所前需要保证纸张数目的够用,如果不够用,需要在进入厕所前提前去老板办公室拿纸。
根据公司量身定制的纸张需求数:
小李: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;}@Overridesynchronized 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();}}
}
发布评论