银行家算法

存在安全序列显示序列内容

若不存在,则不显示

import java.util.LinkedList;
import java.util.Scanner;
import java.util.Queue;


public class Banker2 {

    int Available[]=new int[3];
    int Allocation[][]=new int[5][3];
    int Claim[][]=new int[5][3];
    int Need[][]=new int[5][3];
    int Work[]=new int[3];
    Queue<Integer> queue=new LinkedList<>();
    int count=0;
    int find=0;
    int flag=1;

    public void Input()
    {
        Scanner sc=new Scanner(System.in);
        System.out.println("请分别输入系统中A,B,C三类资源Available的个数:");
        for(int i=0;i<3;i++)
        {
            Available[i]=sc.nextInt();
        }
        System.out.println("请分别输入每个进程的Allocation资源:");
        for(int j=0;j<5;j++)
        {
            System.out.println("输入P"+j+"的Allocation的A B C资源:");
            for(int k=0;k<3;k++)
            {
                Allocation[j][k]=sc.nextInt();
            }
            System.out.println("P"+j+"进程输入完毕。");
        }
        System.out.println("请分别输入每个进程的Claim资源:");
        for(int j=0;j<5;j++)
        {
            System.out.println("输入P"+j+"的Claim的A B C资源:");
            for(int k=0;k<3;k++)
            {
                Claim[j][k]=sc.nextInt();
            }
            System.out.println("P"+j+"进程输入完毕。");
        }
        System.out.println("系统的Available资源为:");
        System.out.println("A B C");
        for(int num:Available)
        {
            System.out.print(num+" ");

        }
        System.out.println("每个进程的Claim资源如下:");
        System.out.println("   A B C");
        for(int i=0;i<5;i++) {
            System.out.print("P" + i + ":" );
            for (int j = 0; j < 3; j++) {
                System.out.print(Claim[i][j] + " ");

            }
            System.out.println();
        }
            System.out.println();
        System.out.println("每个进程的Allocation资源如下:");
        System.out.println("   A B C");
        for(int i=0;i<5;i++) {
            System.out.print("P" + i + ":" );
            for (int j = 0; j < 3; j++) {
                System.out.print(Allocation[i][j] + " ");

            }
            System.out.println();
        }

        for(int i=0;i<5;i++)
        {
            for(int j=0;j<3;j++)
            {
                Need[i][j]=Claim[i][j]-Allocation[i][j];
            }
        }

        System.out.println("每个进程的Need资源如下:");
        System.out.println("   A B C");
        for(int i=0;i<5;i++) {
            System.out.print("P" + i + ":" );
            for (int j = 0; j < 3; j++) {
                System.out.print(Need[i][j] + " ");

            }
            System.out.println();
        }
    }


    public void Calculate()
    {
        for(int i=0;i<3;i++) {
            Work[i]=Available[i];
        }
        while (queue.size() < 5 && count < 5)
        {
            for (int i = 0; i < 5; i++)
            {
                if (Need[i][0] <= Work[0] && Need[i][1] <= Work[1] && Need[i][2] <= Work[2])
                {
                    if (!queue.contains(i))
                    {
                        queue.add(i);
                        count++;
                        for (int k = 0; k < 3; k++)
                        {
                            Work[k] += Allocation[i][k];
                            flag = 1;
                        }
                    }

                }
                else
                    {
                        find++;
                        continue;
                    }
                    if(find>15)
                    {
                        flag=0;
                    }
            }
        }
    }

    public void Output()
    {
        if(flag==0)
        {
            System.out.println("系统处于不安全状态!");
        }
        else {
            System.out.println("安全序列为:");
            for (Integer num : queue) {
                System.out.println(num);
            }
        }
    }

    public static void main(String args[]) throws InterruptedException {
          Scanner sc=new Scanner(System.in);
          System.out.println("提醒:本程序仅适用于资源3种,进程5个");
          Thread.sleep(1000);
          System.out.println("是否开始(y/n):");
          char flag;
          flag=sc.next().charAt(0);
          while(flag=='y') {
              Banker2 b = new Banker2();
              b.Input();
              b.Calculate();
              b.Output();
              System.out.println("是否开始(y/n):");
              flag=sc.next().charAt(0);
          }
          System.out.println("结束。");
    }

}

猜你喜欢

转载自blog.csdn.net/qq_38890412/article/details/80293088
今日推荐