问题
一圆桌前坐着5位小朋友,两个人中间有一只筷子,桌子中央有面条。小朋友边吃边玩,当饿了的时候拿起左右两只筷子吃饭,必须拿到两只筷子才能吃饭。但是,小朋友在吃饭过程中,可能会发生5个小朋友都拿起自己右手边的筷子,这样每个小朋友都因缺少左手边的筷子而没有办法吃饭。本案例要求编写一个程序解决小朋友就餐问题,使每个小朋友都能成功就餐。
运行截图
package com.etime0809.homework;
import java.util.ArrayList;
public class Children extends Thread{
private String name;
private ChildrenList childrenList;
public ChildrenList getChildrenList() {
return childrenList;
}
public void setChildrenList(ChildrenList childrenList) {
this.childrenList = childrenList;
}
@Override
public void run() {
for (int i = 0; i < 5; i++) {
playGames();
if (childrenList.takeFork()) {
eating();
childrenList.putFork();
} else {
playGames();
}
}
}
public Children(String name) {
this.name = name;
}
public void playGames(){
try {
sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" 在玩");
}
public void eating(){
try {
sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" 正在吃饭");
}
}
package com.etime0809.homework;
import com.sun.deploy.security.SelectableSecurityManager;
import java.util.ArrayList;
public class ChildrenList{
//孩子集合
private ArrayList<Children> a = new ArrayList<>();
//筷子集合
private ArrayList<Boolean> b = new ArrayList<>();
public void addChildren(Children c){
a.add(c);
b.add(false);
}
//获取孩子位置
private int getChildren(String name){
for (int i = 0;i<a.size();i++){
if (a.get(i).getName().equals(name)){
return i;
}
}
return -1;
}
//获取筷子
public synchronized boolean takeFork(){
//创建时使线程名字等于孩子名字
String name = Thread.currentThread().getName();
int i = getChildren(name);
//如果有筷子被使用
if (b.get(i) || b.get((i+1)%b.size())){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
b.set(i, true);
b.set((i + 1) % b.size(), true);
return true;
}
//放下筷子
public synchronized void putFork() {
//创建时使线程名字等于孩子名字
String name = Thread.currentThread().getName();
int i = getChildren(name);
b.set(i, false);
b.set((i + 1) % b.size(), false);
notify();
}
public ArrayList<Children> getA() {
return a;
}
public void setA(ArrayList<Children> a) {
this.a = a;
}
public ArrayList<Boolean> getB() {
return b;
}
public void setB(ArrayList<Boolean> b) {
this.b = b;
}
}
package com.etime0809.homework;
public class EatDemo extends Thread{
public static void main(String[] args) {
Children c1 = new Children("zp");
Children c2 = new Children("wjc");
Children c3 = new Children("fh");
Children c4 = new Children("zzh");
Children c5 = new Children("zzc");
ChildrenList childrenList = new ChildrenList();
childrenList.addChildren(c1);
childrenList.addChildren(c2);
childrenList.addChildren(c3);
childrenList.addChildren(c4);
childrenList.addChildren(c5);
c1.setChildrenList(childrenList);
c2.setChildrenList(childrenList);
c3.setChildrenList(childrenList);
c4.setChildrenList(childrenList);
c5.setChildrenList(childrenList);
c1.setName("zp");
c2.setName("wjc");
c3.setName("fh");
c4.setName("zzh");
c5.setName("zzc");
// Thread t1 = new Thread(c1, "zp");
// Thread t2 = new Thread(c1, "wjc");
// Thread t3 = new Thread(c1, "fh");
// Thread t4 = new Thread(c1, "zzh");
// Thread t5 = new Thread(c1, "zzc");
//
// t1.start();
// t2.start();
// t3.start();
// t4.start();
// t5.start();
c1.start();
c2.start();
c3.start();
c4.start();
c5.start();
}
}