package bankeralgorithm;
public class BankerAlgorithmPresenter {
private boolean isError = false;// 是否出错
private boolean isWait = false;// 是否处于等待状态
private boolean isSafeState = true;// 是否安全状态
private int threadId;// 进程序号
private boolean isNeedLargerThanWork = false;//资源需求量是否大于work数量
private Data data;
private int [][]REQUEST;
private int []AVAILABLE;
private int [][]NEED;
private int [][]MAX;
private int[][]ALLOCATION;
boolean[] isFinished = { false, false, false, false };// 为4个进程初始化完成情况为false
public BankerAlgorithmPresenter() {
super();
// TODO Auto-generated constructor stub
data=new Data();
REQUEST=data.getREQUEST();
AVAILABLE=data.getAVAILABLE();
NEED=data.getNEED();
MAX=data.getMAX();
ALLOCATION=data.getALLOCATION();
}
public void setThreadId(int threadId) {
this.threadId=threadId;
}
//检查是否出错
private void checkIsError() {
for (int i = 0; i < 3; i++) {
if (REQUEST[threadId][i] > NEED[threadId][i]) {
isError = true;
break;
}
}
}
//检查是否出错
private void checkIsWait() {
for (int i = 0; i < 3; i++) {
if (REQUEST[threadId][i] > AVAILABLE[i]) {
isWait = true;
break;
}
}
}
//安全性算法中更新数据结构
private void update(int i,int WORK[]) {
if (!isNeedLargerThanWork) {
isFinished[i] = true;
for (int k = 0; k < 3; k++) {
WORK[k] += ALLOCATION[i][k];
}
} else {
isNeedLargerThanWork = false;
}
}
//安全性算法中查找满足条件的值
private void serach(int i,int []WORK) {
if (!isFinished[i]) {
for (int j = 0; j < 3; j++) {// 资源数
if (NEED[i][j] > WORK[j]) {
isNeedLargerThanWork = true;
break;
}
}
}
}
//查找是否有isFinished=falsed的情况发生
private void checkIsFinished() {
for (int i = 0; i < 4; i++) {
if (!isFinished[i]) {
isSafeState = false;
break;
}
}
}
//安全性算法
private void safe() {
// 系统执行安全性算法
int[] WORK = AVAILABLE;
// 开始查找满足条件的进程资源分配情况
// 并改变数据结构中的值
for (int i = 0; i < 4; i++) {// 进程数
serach(i, WORK);
update(i, WORK);
}
}
//执行安全性算法
private void excuteSafeAlgorithm() {
safe();
checkIsFinished();
}
//更改数据结构
private void allocate() {
for (int i = 0; i < 3; i++) {
AVAILABLE[i] -= REQUEST[threadId][i];
ALLOCATION[threadId][i] += REQUEST[threadId][i];
NEED[threadId][i] -= REQUEST[threadId][i];
}
}
//执行
public void execute(OnExcuteListener listener) {
threadId=listener.onStartInputData();
checkIsError();
if (!isError) {
checkIsWait();
if (!isWait) {
allocate();
excuteSafeAlgorithm();
listener.onSuccess(isSafeState);
} else {
listener.onWait(threadId);
}
} else {
listener.onError();
}
}
}
评论0
最新资源