一.定义
死锁:互斥条件,不可占有条件,占有且等待条件,循环等待。 哲学家吃饭问题:一个圆桌上有n个哲学家,每个哲学家左右各有一只筷子,面前有一碗面,当拿到一双筷子时才能得吃,否则只能思考。 当每个哲学家都先拿左边的筷子(或者先拿右边的筷子),此时每个人只有一只筷子,都进行思考,即死锁,我们要避免死锁。
二.代码
1.我们首先要定义一个哲学家类,因为是线程问题所以要继承Thread。哲学家类中包含哲学家的名字,左右筷子。
public class Philosopher extends Thread{ public String name;//哲学家名字 public ChopSticks left;//左边的筷子 public ChopSticks right;//右边的筷子
2.同时我们要定义一个筷子类,其中包含筷子的名字以及筷子方法。
class ChopSticks extends ReentrantLock{ public String name;//筷子的名字 public ChopSticks(String name){ this.name=name; } }
注意:哲学家类和筷子类是独立的。
3.接着我们回到哲学家类,其中要定义两个方法分别是吃和思考。
吃
public void eat(){ if(left.tryLock()){ try{ if(right.tryLock()){ try{ System.out.println(name+"eat..."); }finally { right.unlock(); } } }finally { left.unlock(); } } }
思考
public void think(){ System.out.println(name+"think..."); }
4.最后我们用run()方法调用吃和思考方法 线程启动。
public void run(){ while(true){ think(); eat(); } }
5.主函数
public static void main(String[] args){ ChopSticks c1=new ChopSticks("1"); ChopSticks c2=new ChopSticks("2"); ChopSticks c3=new ChopSticks("3"); ChopSticks c4=new ChopSticks("4"); ChopSticks c5=new ChopSticks("5"); new Philosopher("A",c1,c2).start(); new Philosopher("B",c2,c3).start(); new Philosopher("C",c3,c4).start(); new Philosopher("D",c4,c5).start(); new Philosopher("E",c5,c1).start(); }