Java实现哲学家进餐问题(防死锁)

这篇博客与其他妖艳的骚货不同,它简单易懂(其实是高难度的不会),但是直指问题的本质。(另外和我一样是操作实习的同学不要抄我作业哦)

问题描述:

Dijkstra提出并解决的哲学家进餐问题(The Dinning Philosophers Problem)是典型的同步问题。该问题是描述有五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上五只筷子,他们的生活方式是交替地进行思考和进餐。平时,一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有在他拿到两只筷子时才能进餐。进餐完毕,放下筷子继续思考。

package 死锁;
import java.util.*;
public class Sisuo {




	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Integer a = new Integer(0);
		Integer b = new Integer(0);
		Integer c = new Integer(0);
		Integer d = new Integer(0);
		Integer e = new Integer(0);
		int arr[]={1,2,3,4,5};
		Scanner scan = new Scanner(System.in);
        System.out.print("请输入最多4位哲学家代号,格式如:输入1 2 3 4 5(不选用的哲学家用0代替,必须凑齐5位数):");
        String str = scan.nextLine();
        String[] strs = str.split(" ");
        if(strs.length != 5){
            System.out.println("参数输入不合法!");
            return;
        }
         a = Integer.valueOf(strs[0]);
         b = Integer.valueOf(strs[1]);
         c = Integer.valueOf(strs[2]);
         d = Integer.valueOf(strs[3]);
         e = Integer.valueOf(strs[4]);
         int a1=a.intValue();
         int b1=b.intValue();
         int c1=c.intValue();
         int d1=d.intValue();
         int e1=e.intValue();
         if(a1+b1+c1+d1+e1==15){
             System.out.println("出现死锁!");
             return;
         }
        //要吃饭的都拿起左筷子
         if(a1==1){
        	arr[0]=0;
         }
         if(b1==2){
         	arr[1]=0;
          }
         if(c1==3){
         	arr[2]=0;
          }
         if(d1==4){
         	arr[3]=0;
          }
         if(e1==5){
         	arr[4]=0;
          }
         int i=0,num=0;
         for(int j=0;j<arr.length;j++) {//为最后一个for循环停止
        	 if(arr[j]==0) {
        		i=i+1;
        	 }
         }
         int m=0,n=0,x=0,z=0,y=0;//这几个变量是核心保证赋值后第一遍循环不会使用
         for(int k=0;k<10;k++){
        	 if(a1==1 && m==0){
        		 if(arr[1]==2){
        			 System.out.println("哲学家1号开始进食");
        			 num=num+1;
        			 arr[0]=1;
        			 a1=0;
        			 z =1;
        		 }
        	 }
        	 if(b1==2 && n==0){
        		 if(arr[2]==3){
        			 System.out.println("哲学家2号开始进食");
        			 num=num+1;
        			 arr[1]=2;
        			 b1=0;
        			 m=1;
        		 }
        	 }
        	 if(c1==3 && x==0){
        		 if(arr[3]==4){
        			 System.out.println("哲学家3号开始进食");
        			 num=num+1;
        			 arr[2]=3;
        			 c1=0;
        			 n=1;
        		 }
        	 }
        	 if(d1==4 && y==0){
        		 if(arr[4]==5){
        			 System.out.println("哲学家4号开始进食");
        			 num=num+1;
        			 arr[3]=4;
        			 d1=0;
        			 x=1;
        		 }
        	 }
        	 if(e1==5 && z==0){
        		 if(arr[0]==1){
        			 System.out.println("哲学家5号开始进食");
        			 num=num+1;
        			 arr[4]=5;
        			 e1=0;
        			 y=1;
        		 }
        	 }
        	 m=0;n=0;x=0;z=0;y=0;
        	 try {
				Thread.sleep(3000);
			 } catch (InterruptedException e2) {
				e2.printStackTrace();
			 }
        	 System.out.println("进食完毕");
        	 if(num==i) {
        		 System.out.println("所选哲学家已全部进食完毕,未出现死锁");
        		 break;
        	 }
            }
        }
   }

猜你喜欢

转载自blog.csdn.net/gayhang/article/details/80330754