最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java實(shí)現(xiàn)簡(jiǎn)單銀行家算法

 更新時(shí)間:2019年12月26日 11:50:03   作者:SZ996795  
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單銀行家算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了java實(shí)現(xiàn)銀行家算法的具體代碼,供大家參考,具體內(nèi)容如下

題目:

初始時(shí),Allocate[i,j]=0,表示初始時(shí)沒有進(jìn)程得到任何資源。假定進(jìn)程對(duì)資源的請(qǐng)求序
列為:

Request(1)[M]=(1,0,0);
Request(2)[M]=(2,1,0);
Request(2)[M]=(2,0,1);
Request(3)[M]=(2,1,1);
Request(4)[M]=(0,0,2);
Request(2)[M]=(1,0,1);
Request(1)[M]=(1,0,1);

請(qǐng)用 Banker 算法判斷每一次資源請(qǐng)求是否接受,如果接受請(qǐng)求,請(qǐng)給出請(qǐng)求接受后的資
源分配狀態(tài),即 Allocate 矩陣、Need 矩陣和 Available 向量。

大致思路:

(1):判斷該進(jìn)程資源請(qǐng)求是否小于Need需求矩陣,小于則進(jìn)第二步
(2):判斷該進(jìn)程資源請(qǐng)求向量是否小于剩余資源向量Available,小于則進(jìn)入第三步
(3):備份下資源狀態(tài)矩陣,假設(shè)接收該需求,求出相應(yīng)的資源狀態(tài)矩陣,需求矩陣,剩余資源向量
(4):判斷接收請(qǐng)求后的狀態(tài)是否是安全狀態(tài)
A:初始該狀態(tài)下的進(jìn)程標(biāo)識(shí)都為false,work為資源剩余向量
B;循環(huán)該狀態(tài)下的進(jìn)程,如果滿足標(biāo)識(shí)為false,并且該進(jìn)程的需求向量小于work 則進(jìn)入C,當(dāng)循環(huán)完畢都沒有滿足條件的進(jìn)入D。
C:work+Allocate(對(duì)應(yīng)進(jìn)程的狀態(tài)),將該進(jìn)程對(duì)應(yīng)的進(jìn)程狀態(tài)標(biāo)識(shí)為true,將B的循環(huán)數(shù)變?yōu)?,從頭開始循環(huán)(進(jìn)入B)
D:循環(huán)遍歷該狀態(tài)下的進(jìn)程標(biāo)識(shí),如果都為true則判斷狀態(tài)安全,否則判斷狀態(tài)不安全
(5):如果狀態(tài)是安全的輸入該狀態(tài)下的各個(gè)矩陣與向量,如果不安全,則利用剛剛備份的資源狀態(tài)矩陣,回滾。

運(yùn)行截圖:

源代碼

package Banker;

public class Banker {
 public static int N = 4;// 線程個(gè)數(shù)
 public static int M = 3;// 資源個(gè)數(shù)
 public static int[] Resource = { 9, 3, 6 };// 資源向量;
 public static int[][] Cliam = { { 3, 2, 2 }, { 6, 1, 3 }, { 3, 1, 4 }, { 4, 2, 2 } };
 public static int[][] Allocate = new int[N][M];
 public static int[][] Need = { { 3, 2, 2 }, { 6, 1, 3 }, { 3, 1, 4 }, { 4, 2, 2 } };
 public static int[] Available = { 9, 3, 6 };
 public int[][] state = new int[N][M];
 

 
 public static void main(String args[]) {

 Banker ban = new Banker();
 //請(qǐng)求序列數(shù)組,包含第幾個(gè)請(qǐng)求,那條進(jìn)程,請(qǐng)求資源向量。
 int[][][] re={{{1},{1,0,0}},{{2},{2,1,0}},{{2},{2,0,1}},{{3},{2,1,1}},{{4},{0,0,2}},{{2},{1,0,1}},{{1},{1,0,1}}};
 for(int j=0;j<re.length;j++){
 /*
 * re[j][1] 請(qǐng)求向量
 * re[j][0][0]-1 第幾個(gè)進(jìn)程
 * j第幾個(gè)請(qǐng)求
 */
 ban.judgeqingqiu(re[j][1], re[j][0][0]-1, j);//輸入第幾條進(jìn)程,請(qǐng)求向向量,第幾個(gè)請(qǐng)求,調(diào)用判斷是否符合要求函數(shù) 
 }
 
 
 }


 //判斷請(qǐng)求是否符合要求
 public void judgeqingqiu(int[] Request, int i,int j) {
 /*judgementrequest(Request, i)調(diào)用函數(shù),判斷該進(jìn)程請(qǐng)求向量是否小于請(qǐng)求矩陣中對(duì)應(yīng)的向量請(qǐng)求資源
 * judgementrequest(Request, i)調(diào)用函數(shù),判斷該進(jìn)程請(qǐng)求向量是否小于剩于資源向量
 */
 if (judgementrequest(Request, i) && judgementrequest(Request, i)) {
 distribute(Request,i);//調(diào)用假設(shè)分配函數(shù),并將分配狀態(tài)copy出來(lái)
 //judgementsafe(Allocate)判斷是否是安全狀態(tài)
 if (judgementsafe(Allocate)) {
 
 System.out.println("############");
 System.out.println("第"+(j+1)+"個(gè)請(qǐng)求"+"進(jìn)程"+(i+1)+"請(qǐng)求資源被允許");
 printJuzhen("Allocate", Allocate);
 printJuzhen("Need", Need);
 PrintXianglaing("Available", Available);
 } else {
 System.out.println("############");
 System.out.println("第"+(j+1)+"個(gè)請(qǐng)求"+"進(jìn)程"+(i+1)+"請(qǐng)求資源被拒絕");
 erWeiCopy(Allocate, state);
 }
 } else {
 System.out.println("*****************");
 System.out.println("第"+(j+1)+"個(gè)請(qǐng)求"+"進(jìn)程"+(i+1)+"請(qǐng)求資源被拒絕");
 }
 }

 // 假設(shè)符合,分配資源,記錄下剩余資源
 public void distribute(int[] Request,int i) {

 state = erWeiCopy(state, Allocate);//將資源分配矩陣保留下來(lái),如果不正確方便回滾
 Allocate = addrequest(Allocate, Request, i);//分配后的資源分配矩陣
 Need = reducerequest(Need, Allocate);//分配后的資源需求矩陣
 Available = AvaileReduceRequest(Available, Allocate);//分配后的資源剩余矩陣
 }
 
 // 判斷狀態(tài)安全函數(shù)
 public boolean judgementsafe(int[][] Allocate) {
 int[] work = new int[M];//相當(dāng)于標(biāo)記變量,標(biāo)識(shí)進(jìn)程是否符合,如果符合為true
 work = yiweicopy(work, Available);//將剩余資源響亮copy到work中
 boolean safe = true;//安全狀態(tài),默認(rèn)為true
 Boolean[] finish = { false, false, false, false };//相當(dāng)于標(biāo)記變量,標(biāo)識(shí)進(jìn)程是否符合,如果符合為true,初始值都為false
 //循環(huán)遍歷該狀態(tài)中的進(jìn)程,判斷進(jìn)程的資源需求是否小于剩余資源數(shù)
 for (int j = 0; j < N; j++) {
 //進(jìn)程資源請(qǐng)求是否小于剩余資源work,并且該進(jìn)程標(biāo)識(shí)為false,
 if (judgementsafeWork(Need[j], work) && finish[j] == false) {
  finish[j] = true;//,將該進(jìn)程標(biāo)識(shí)為true,改變work
  for (int h = 0; h < M; h++) {
  work[h] = work[h] + Allocate[j][h];
  }
  j = -1;//,將j=0,再次從頭遍歷查看進(jìn)程
 }
 }
 /*
 * 當(dāng)沒有進(jìn)程滿足資源請(qǐng)求是否小于剩余資源work,并且該進(jìn)程標(biāo)識(shí)為false時(shí)
 * 遍歷狀態(tài)數(shù)組,看是否都為true
 */
 for (int m = 0; m < N; m++) {
 if (finish[m] == false) {
  safe = false;//如果狀態(tài)數(shù)組中有false那么將safe設(shè)置為false
 }
 }
 return safe;
 }

 // 判斷狀態(tài)是否安全時(shí)進(jìn)程資源請(qǐng)求是否小于剩余資源work
 public boolean judgementsafeWork(int[] Request, int[] work) {
 for (int k = 0; k < M; k++) {
// PrintXianglaing("",Request);
 if (Request[k] >work[k]) {
  return false;
 }
 }
 return true;//返回狀態(tài)

 }

 
 // 判斷該進(jìn)程請(qǐng)求向量是否小于請(qǐng)求矩陣中對(duì)應(yīng)的向量請(qǐng)求資源
 public boolean judgementrequest(int[] Request, int i) {
 
 for (int j = 0; j < M; j++) {
 if (Request[j] > Need[i][j]) {
 return false;
 }
 }
 
 return true;
 }

 // 判斷該進(jìn)程請(qǐng)求向量是否小于剩于資源向量
 public boolean judgementAvali(int[] Request) {
 for (int j = 0; j < M; j++) {
 if (Request[j] >Available[j]) {
 return false;
 }
 }
 return true;

 }

 // 假設(shè)分配后修改資源分配矩陣
 public int[][] addrequest(int[][] Allocate, int[] Request, int i) {

 for (int h = 0; h < M; h++) {
 Allocate[i][h] = Allocate[i][h] + Request[h];
 }

 return Allocate;

 }

 // 假設(shè)分配后修改資源的需求矩陣
 public int[][] reducerequest(int[][] Need, int[][] state) {
 for (int j = 0; j < N; j++) {
 for (int h = 0; h < M; h++) {
 Need[j][h] = Cliam[j][h] - state[j][h];
 }
 }
 return Need;
 }

 // 假設(shè)分配后修改資源剩余矩陣
 public int[] AvaileReduceRequest(int[] Available, int[][] Allocate) {
 Available = yiweicopy(Available, Resource);
 for (int j = 0; j < N; j++) {
 for (int h = 0; h < M; h++) {
 Available[h] = Available[h] - Allocate[j][h];
 }
 }
 return Available;
 }
 
 // 二維數(shù)組拷貝
 public int[][] erWeiCopy(int[][] x1, int[][] y1) {
 for (int j = 0; j < N; j++) {
 for (int h = 0; h < M; h++) {
 x1[j][h] = y1[j][h];
 }
 }
 return x1;
 }

 // 一維數(shù)組拷貝
 public int[] yiweicopy(int[] x1, int[] y1) {
 for (int j = 0; j < M; j++) {
 x1[j] = y1[j];
 }
 return x1;
 }

 // 打印向量
 public static void PrintXianglaing(String id, int[] x) {
 System.out.println(id);
 for (int j = 0; j < x.length; j++) {
 System.out.print(x[j] + " ");
 }
 System.out.println("");
 }

 // 打印矩陣
 public static void printJuzhen(String id, int[][] y) {
 System.out.println(id);
 for (int j = 0; j < N; j++) {
 for (int h = 0; h < M; h++) {
 System.out.print(y[j][h] + " ");
 }
 System.out.println();
 }
 }

}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring cloud restTemplate 傳遞復(fù)雜參數(shù)的方式(多個(gè)對(duì)象)

    Spring cloud restTemplate 傳遞復(fù)雜參數(shù)的方式(多個(gè)對(duì)象)

    這篇文章主要介紹了Spring cloud restTemplate 傳遞復(fù)雜參數(shù)的方式(多個(gè)對(duì)象),需要的朋友可以參考下
    2018-05-05
  • springboot之Jpa通用接口及公共方法使用示例

    springboot之Jpa通用接口及公共方法使用示例

    這篇文章主要為大家介紹了springboot?之Jpa通用接口及公共方法使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Spring Boot通過(guò)Redis實(shí)現(xiàn)防止重復(fù)提交

    Spring Boot通過(guò)Redis實(shí)現(xiàn)防止重復(fù)提交

    表單提交是一個(gè)非常常見的功能,如果不加控制,容易因?yàn)橛脩舻恼`操作或網(wǎng)絡(luò)延遲導(dǎo)致同一請(qǐng)求被發(fā)送多次,本文主要介紹了Spring Boot通過(guò)Redis實(shí)現(xiàn)防止重復(fù)提交,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • Java 數(shù)組ArrayList常用語(yǔ)法詳解

    Java 數(shù)組ArrayList常用語(yǔ)法詳解

    這篇文章主要介紹了Java 數(shù)組ArrayList常用語(yǔ)法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • java為何不能多繼承的原因詳解

    java為何不能多繼承的原因詳解

    多重繼承是一個(gè)子類從多個(gè)父類中繼承屬性和方法。C++, Common Lisp是時(shí)下支持多重繼承的流行語(yǔ)言。那java為何不能多繼承呢,下面小編帶大家來(lái)一起學(xué)習(xí)一下吧
    2019-06-06
  • 詳解MyBatis如何在大數(shù)據(jù)量下使用流式查詢進(jìn)行數(shù)據(jù)同步

    詳解MyBatis如何在大數(shù)據(jù)量下使用流式查詢進(jìn)行數(shù)據(jù)同步

    通常的數(shù)據(jù)同步中,如果數(shù)據(jù)量比較少的話可以直接全量同步,但是如果數(shù)據(jù)量很大的話,全量同步需要大量的內(nèi)存,所以本文為大家介紹了MyBatis使用流式查詢實(shí)現(xiàn)數(shù)據(jù)同步的方法,希望對(duì)大家有所幫助
    2023-05-05
  • SpringBoot 配置文件中配置的中文,程序讀取出來(lái)是亂碼的解決

    SpringBoot 配置文件中配置的中文,程序讀取出來(lái)是亂碼的解決

    這篇文章主要介紹了SpringBoot 配置文件中配置的中文,程序讀取出來(lái)是亂碼的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • Java集合框架入門之泛型和包裝類

    Java集合框架入門之泛型和包裝類

    Java 泛型(generics)是 JDK 5 中引入的一個(gè)新特性, 泛型提供了編譯時(shí)類型安全檢測(cè)機(jī)制,該機(jī)制允許程序員在編譯時(shí)檢測(cè)到非法的類型。泛型的本質(zhì)是參數(shù)化類型,也就是說(shuō)所操作的數(shù)據(jù)類型被指定為一個(gè)參數(shù)
    2021-10-10
  • Java中equals與==的用法和區(qū)別

    Java中equals與==的用法和區(qū)別

    這篇文章主要給大家介紹了關(guān)于Java中equals與==的用法和區(qū)別的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • 使用Spring事件監(jiān)聽機(jī)制實(shí)現(xiàn)跨模塊調(diào)用的步驟詳解

    使用Spring事件監(jiān)聽機(jī)制實(shí)現(xiàn)跨模塊調(diào)用的步驟詳解

    Spring 事件監(jiān)聽機(jī)制是 Spring 框架中用于在應(yīng)用程序的不同組件之間進(jìn)行通信的一種機(jī)制,Spring 事件監(jiān)聽機(jī)制基于觀察者設(shè)計(jì)模式,使得應(yīng)用程序的各個(gè)部分可以解耦,提高模塊化和可維護(hù)性,本文給大家介紹了使用Spring事件監(jiān)聽機(jī)制實(shí)現(xiàn)跨模塊調(diào)用,需要的朋友可以參考下
    2024-06-06

最新評(píng)論

台江县| 高唐县| 宁都县| 竹山县| 东辽县| 博兴县| 永川市| 云梦县| 北海市| 临高县| 江口县| 洛川县| 广安市| 阳朔县| 如皋市| 沿河| 察哈| 乌兰浩特市| 应用必备| 佳木斯市| 安仁县| 濮阳县| 神池县| 鄂托克旗| 临夏县| 桃园市| 梧州市| 漳浦县| 噶尔县| 内丘县| 云梦县| 威宁| 全州县| 成安县| 蓬溪县| 印江| 乐安县| 安多县| 康保县| 定南县| 肇庆市|