哲学家问题(java)的三个解法
//加synchronize进行同步 //释放资源又很快获得自身的资源,这样不妥,吃完的话休息100ms //每个人先申请编号小的筷子 public class Philosopher implements Runnable { int[] fork=new int[5]; Thread thread1=new Thread(this,"1"); Thread thread2=new Thread(this,"2"); Thread thread3=new Thread(this,"3"); Thread thread4=new Thread(this,"4"); Thread thread5=new Thread(this,"5"); public void run() { try { while (true) { if (Thread.currentThread().getName().equals("1")) { while (fork[0]==1) { synchronized (this) { wait(); } } fork[0]=1; while (fork[1]==1) { synchronized (this) { wait(); } } fork[1]=1; System.out.println("1 eats for 3 seconds"); Thread.sleep(3000); fork[0]=0; fork[1]=0; synchronized(this) { notifyAll(); } Thread.sleep(100); } else if (Thread.currentThread().getName().equals("2")) { while (fork[1]==1) { synchronized(this) { wait(); } } fork[1]=1; while (fork[2]==1) { synchronized(this) { wait(); } } fork[2]=1; System.out.println("2 eats for 3 seconds"); Thread.sleep(3000); fork[1]=0; fork[2]=0; synchronized(this) { notifyAll(); } Thread.sleep(100); } else if (Thread.currentThread().getName().equals("3")) { while (fork[2]==1) { synchronized(this) { wait(); } } fork[2]=1; while (fork[3]==1) { synchronized(this) { wait(); } } fork[3]=1; System.out.println("3 eats for 3 seconds"); Thread.sleep(3000); fork[2]=0; fork[3]=0; synchronized(this) { notifyAll(); } Thread.sleep(100); } else if (Thread.currentThread().getName().equals("4")) { while (fork[3]==1) { synchronized(this) { wait(); } } fork[3]=1; while (fork[4]==1) { synchronized(this) { wait(); } } fork[4]=1; System.out.println("4 eats for 3 seconds"); Thread.sleep(3000); fork[3]=0; fork[4]=0; synchronized(this) { notifyAll(); } Thread.sleep(100); } else if (Thread.currentThread().getName().equals("5")) { while (fork[0]==1) { synchronized(this) { wait(); } } fork[0]=1; while (fork[4]==1) { synchronized(this) { wait(); } } fork[4]=1; System.out.println("5 eats for 3 seconds"); Thread.sleep(3000); fork[0]=0; fork[4]=0; synchronized(this) { notifyAll(); } Thread.sleep(100); } } } catch(Exception e) { e.printStackTrace(); } } public static void main(String[] args) { Philosopher phi=new Philosopher(); for (int i=0;i<5;i++) phi.fork[i]=0; phi.thread1.start(); phi.thread2.start(); phi.thread3.start(); phi.thread4.start(); phi.thread5.start(); } } //当某个线程试图等待一个自己并不拥有的对象(O)的监控器或者通知其他线程等待该对象(O)的监控器时,抛出该异常。
//让刚吃完的一个人阻塞,5根筷子供4个人选,则必有一个人获得在其左右的两双筷子 public class Philosopher1 implements Runnable { int[] ifeat=new int[5]; int[] fork=new int[5]; int noteat; Thread thread1=new Thread(this,"1"); Thread thread2=new Thread(this,"2"); Thread thread3=new Thread(this,"3"); Thread thread4=new Thread(this,"4"); Thread thread5=new Thread(this,"5"); public void run() { try { while (true) { if (Thread.currentThread().getName().equals("1")) { while (ifeat[0]==1) { synchronized (this) { wait(); } } while (fork[0]==1) { synchronized (this) { wait(); } } fork[0]=1; while (fork[1]==1) { synchronized (this) { wait(); } } fork[1]=1; System.out.println("1 eats for 3 seconds"); Thread.sleep(3000); fork[0]=0; fork[1]=0; ifeat[noteat]=0; noteat=0; ifeat[0]=1; synchronized(this) { notifyAll(); } Thread.sleep(100); } else if (Thread.currentThread().getName().equals("2")) { while (ifeat[1]==1) { synchronized (this) { wait(); } } while (fork[1]==1) { synchronized (this) { wait(); } } fork[1]=1; while (fork[2]==1) { synchronized (this) { wait(); } } fork[2]=1; System.out.println("2 eats for 3 seconds"); Thread.sleep(3000); fork[1]=0; fork[2]=0; ifeat[noteat]=0; noteat=1; ifeat[1]=1; synchronized(this) { notifyAll(); } Thread.sleep(100); } else if (Thread.currentThread().getName().equals("3")) { while (ifeat[2]==1) { synchronized (this) { wait(); } } while (fork[2]==1) { synchronized (this) { wait(); } } fork[2]=1; while (fork[3]==1) { synchronized (this) { wait(); } } fork[3]=1; System.out.println("3 eats for 3 seconds"); Thread.sleep(3000); fork[2]=0; fork[3]=0; ifeat[noteat]=0; noteat=2; ifeat[2]=1; synchronized(this) { notifyAll(); } Thread.sleep(100); } else if (Thread.currentThread().getName().equals("4")) { while (ifeat[3]==1) { synchronized (this) { wait(); } } while (fork[3]==1) { synchronized (this) { wait(); } } fork[3]=1; while (fork[4]==1) { synchronized (this) { wait(); } } fork[4]=1; System.out.println("4 eats for 3 seconds"); Thread.sleep(3000); fork[3]=0; fork[4]=0; ifeat[noteat]=0; noteat=3; ifeat[3]=1; synchronized(this) { notifyAll(); } Thread.sleep(100); } else if (Thread.currentThread().getName().equals("5")) { while (ifeat[4]==1) { synchronized (this) { wait(); } } while (fork[4]==1) { synchronized (this) { wait(); } } fork[4]=1; while (fork[0]==1) { synchronized (this) { wait(); } } fork[0]=1; System.out.println("5 eats for 3 seconds"); Thread.sleep(3000); fork[4]=0; fork[0]=0; ifeat[noteat]=0; noteat=4; ifeat[4]=1; synchronized(this) { notifyAll(); } Thread.sleep(100); } } } catch(Exception e) { e.printStackTrace(); } } public static void main(String[] args) { Philosopher1 phi=new Philosopher1(); for (int i=0;i<5;i++) phi.fork[i]=0; phi.ifeat[0]=1; for (int i=0;i<5;i++) phi.ifeat[i]=0; phi.noteat=0; phi.thread1.start(); phi.thread2.start(); phi.thread3.start(); phi.thread4.start(); phi.thread5.start(); } }
//只有两双筷子都有,才获取,且同时获取两双筷子 public class Philosopher2 implements Runnable { int[] fork=new int[5]; Thread thread1=new Thread(this,"1"); Thread thread2=new Thread(this,"2"); Thread thread3=new Thread(this,"3"); Thread thread4=new Thread(this,"4"); Thread thread5=new Thread(this,"5"); public void run() { try { while (true) { if (Thread.currentThread().getName().equals("1")) { while (fork[0]==1 || fork[1]==1) { synchronized (this) { wait(); } } fork[0]=1; fork[1]=1; System.out.println("1 eats for 3 seconds"); Thread.sleep(3000); fork[0]=0; fork[1]=0; synchronized(this) { notifyAll(); } Thread.sleep(100); } else if (Thread.currentThread().getName().equals("2")) { while (fork[1]==1 || fork[2]==1) { synchronized (this) { wait(); } } fork[1]=1; fork[2]=1; System.out.println("2 eats for 3 seconds"); Thread.sleep(3000); fork[1]=0; fork[2]=0; synchronized(this) { notifyAll(); } Thread.sleep(100); } else if (Thread.currentThread().getName().equals("3")) { while (fork[2]==1 || fork[3]==1) { synchronized (this) { wait(); } } fork[2]=1; fork[3]=1; System.out.println("3 eats for 3 seconds"); Thread.sleep(3000); fork[2]=0; fork[3]=0; synchronized(this) { notifyAll(); } Thread.sleep(100); } else if (Thread.currentThread().getName().equals("4")) { while (fork[3]==1 || fork[4]==1) { synchronized (this) { wait(); } } fork[3]=1; fork[4]=1; System.out.println("4 eats for 3 seconds"); Thread.sleep(3000); fork[3]=0; fork[4]=0; synchronized(this) { notifyAll(); } Thread.sleep(100); } else if (Thread.currentThread().getName().equals("5")) { while (fork[0]==1 || fork[4]==1) { synchronized (this) { wait(); } } fork[0]=1; fork[4]=1; System.out.println("5 eats for 3 seconds"); Thread.sleep(3000); fork[0]=0; fork[4]=0; synchronized(this) { notifyAll(); } Thread.sleep(100); } } } catch(Exception e) { e.printStackTrace(); } } public static void main(String[] args) { Philosopher2 phi=new Philosopher2(); for (int i=0;i<5;i++) phi.fork[i]=0; phi.thread1.start(); phi.thread2.start(); phi.thread3.start(); phi.thread4.start(); phi.thread5.start(); } }