/**
?*?宇宙的能量系統
?*?遵循能量守恒定律:
?*?能量不會憑空創生或消失,只會從一處轉移到另一處
?*/
public?class?EnergySystem?{
//能量盒子,能量存貯的地方
?private?final?double[]?energyBoxes;
?private?final?Object?lockObj?=?new?Object();
?
?/**
??*?
??*?@param?n????能量盒子的數量
??*?@param?initialEnergy?每個能量盒子初始含有的能量值
??*/
?public?EnergySystem(int?n,?double?initialEnergy){
?energyBoxes?=?new?double[n];
?for?(int?i?=?0;?i?<?energyBoxes.length;?i++)
?energyBoxes[i]?=?initialEnergy;
?}
?
?/**
??*?能量的轉移,從一個盒子到另一個盒子
??*?@param?from?能量源
??*?@param?to?????能量終點?
??*?@param?amount?能量值
??*/
?public?void?transfer(int?from,?int?to,?double?amount){
?
?synchronized(lockObj){
?
//while循環,保證條件不滿足時任務都會被條件阻擋
?//而不是繼續競爭CPU資源
?while?(energyBoxes[from]?<?amount){
?try?{
//條件不滿足,?將當前線程放入Wait?Set
lockObj.wait();
}?catch?(InterruptedException?e)?{
e.printStackTrace();
}
?}
?
?
?System.out.print(Thread.currentThread().getName());
?energyBoxes[from]?-=?amount;
?System.out.printf("從%d轉移%10.2f單位能量到%d",?from,?amount,?to);
?energyBoxes[to]?+=?amount;
?System.out.printf("?能量總和:%10.2f%n",?getTotalEnergies());
//喚醒所有在lockObj對象上等待的線程
?lockObj.notifyAll();
?}
?
?}
?
?/**
??*?獲取能量世界的能量總和?
??*/
?public?double?getTotalEnergies(){
?double?sum?=?0;
?for?(double?amount?:?energyBoxes)
?sum?+=?amount;
?return?sum;
?}
?
?/**
??*?返回能量盒子的長度
??*/
?public??int?getBoxAmount(){
?return?energyBoxes.length;
?}
?
}請問關于這段代碼 ?如果滿足energyBoxes[from] < amount的while循環 ?則線程被堵塞我想問的是 如果之后使用lockObj.notifyAll();喚醒等待線程之后,再去競爭CPU資源。這樣的話她不是還滿足while循環最終面臨的還是被鎖,請問這個意義何在?;蛘邞撊绾卫斫?
添加回答
舉報
0/150
提交
取消