private boolean safeCheck() { boolean finish[] = new boolean[Banker.NumThreads]; int work[] = new int[Banker.NumRes]; //make copy of Avail for (int i = 0; i < Banker.NumRes; i++) work[i] = avail[i]; boolean changed = true; while (changed == true) { changed = false; for ( j = 0; j < Banker.NumThreads; j++) { if (true == finish[j]) continue; boolean canFinish = true; // true if (need[] <= Work[]) for (int i = 0; i < Banker.NumRes; i++) if (need[j][i] > work[i]) canFinish = false; if (canFinish) { finish[j] = true; //flag thread as finished for (int i = 0; i < Banker.NumRes; i++) work[i] += Alloc[j][i]; // add its alloc into work; changed = true; } } //for each thread boolean done = true; //check if all threads have finished for (int j = 0; j < Banker.NumThreads; j++) if (! (finish[j])) done = false; if (done) return true; } //while (changed) return false; //not all can finish, therefore unsafe }