JAVA多线程学习–哲学家就餐问题

哲学家就餐问题是1965年由Dijkstra提出的一种线程同步的问题。

问题描述:一圆桌前坐着5位哲学家,两个人中间有一只筷子,桌子中央有面条。哲学家思考问题,当饿了的时候拿起左右两只筷子吃饭,,必须拿到两只筷子才能吃饭。上述问题会产生死锁的情况,当5个哲学家都拿起自己右手边的筷子,准备拿左手边的筷子时产生死锁现象。

解决办法:

  1、添加一个服务生,只有当经过服务生同意之后才能拿筷子,服务生负责避免死锁发生。

  2、每个哲学家必须确定自己左右手的筷子都可用的时候,才能同时拿起两只筷子进餐,吃完之后同时放下两只筷子。

  3、规定每个哲学家拿筷子时必须拿序号小的那只,这样最后一位未拿到筷子的哲学家只剩下序号大的那只筷子,不能拿起,剩下的这只筷子就可以被其他哲学家使用,避免了死锁。这种情况不能很好的利用资源。 

代码实现:实现第2种方案

package cn.edu.sdust.Philosopher; Philosopher extends Thread{private String name;private Fork fork;public Philosopher(String name,Fork fork){super(name);this.name=name;this.fork=fork;}public void run(){while(true){thinking();fork.takeFork();eating();fork.putFork();}}public void eating(){System.+name);try {sleep(1000);//模拟吃饭,占用一段时间资源} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public void thinking(){System.+name);try {sleep(1000);//模拟思考} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}class Fork{boolean[] used={false,false,false,false,false,false};synchronized void takeFork(){String name = Thread.currentThread().getName();int i = Integer.parseInt(name);while(used[i]||used[(i+1)%5]){try {wait();//如果左右手有一只正被使用,等待} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}used[i ]= true;used[(i+1)%5]=true;}synchronized void putFork(){String name = Thread.currentThread().getName();int i = Integer.parseInt(name);used[i ]= false;used[(i+1)%5]=false;notifyAll();//唤醒其他线程 }} ThreadTest { main(String []args){Fork fork = new Fork();,fork).start();,fork).start();,fork).start();,fork).start();,fork).start();}}自己变得跟水晶一般透明,

JAVA多线程学习–哲学家就餐问题

相关文章:

你感兴趣的文章:

标签云: