免責事項:この記事はブロガーオリジナル記事です。再現ブロガーの承認を連絡してください。ブロガー公共マイクロチャネル番号] [部門知るのとキャンパスを行います。https://blog.csdn.net/cxh_1231/article/details/86481718
注意:この記事の文書WHUT-専門学校-オペレーティングシステム上のコース 実験2:プロセス管理
紙はZhongjueを来る、実際には、問題を認識することが不可欠です!
1.実験:
実験の準備は:処理するために、コンテンツ、プロセス管理、同期やミューテックス、セマフォのメカニズムを習得しての深い理解を持っています
実験:セマフォメカニズム用いた決済食事する哲学者の問題をシミュレート (または他の古典同期の問題を)
具体的な要件:
- 1高レベルのコンピュータプログラミング言語を選択してください
- 達成5 哲学(5本の志箸)スムーズに食事を
- 避ける必要性、デッドロックを
- セマフォを使用して、セマフォ待ちキューと
- 使用したP 演算子を、Vの操作
- 各ディスプレイは箸のそれぞれの哲学者、および状態可能
2、実行ショット:
図3に示すように、ソースコード:
package test2;
/*每个哲学家安排一个线程*/
class Philosopher extends Thread{
private String name;
private Chopsticks Chopsticks;
public Philosopher(String name,Chopsticks Chopsticks){
super(name);
this.name=name;
this.Chopsticks=Chopsticks;
}
//重构
public void run(){
while(true){
//哲学家的状态就是:思考→进餐→思考 循环
thinking();
Chopsticks.P();
eating();
Chopsticks.V();
}
}
public void eating(){
int i = Integer.parseInt(name);
System.out.println("哲学家 " + name + "号 开始拿着筷子 "+ i +" 和 "+ (i+1)%5 + "进餐!");//打印哲学家状态和筷子状态
try {
sleep(2000);//假设吃饭时间为5秒钟
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void thinking(){
System.out.println("哲学家 " + name + "号 陷入了思考!");
try {
sleep(2000);//假设思考4秒钟
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Chopsticks{
/*5只筷子,初始为1,即未被用*/
private int[] ChopStatus={1,1,1,1,1};
//避免死锁
/*P操作:只有当左右手的筷子都未被使用时,才允许获取筷子,且必须同时获取左右手筷子*/
public synchronized void P(){
//获得当前线程的名字(哲学家)
String name = Thread.currentThread().getName();
int i = Integer.parseInt(name);
//当当前线程哲学家左右手的筷子已经被占用
while(ChopStatus[i]==0||ChopStatus[(i+1)%5]==0){
try {
System.out.println("哲学家 "+ name +"号 正在等待筷子!");
//当前哲学家线程进入等待状态
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//获得左右筷子,修改筷子状态
ChopStatus[i]-=1 ;
ChopStatus[(i+1)%5]-=1;
}
/*V操作:同时释放左右手的筷子*/
public synchronized void V(){
//获得当前线程的名字(哲学家)
String name = Thread.currentThread().getName();
int i = Integer.parseInt(name);
//释放左右筷子
ChopStatus[i]+=1;
ChopStatus[(i+1)%5]+=1;
//唤醒等待序列中的线程
notifyAll();
}
}
public class Think_Eat {
public static void main(String []args){
Chopsticks Chopsticks = new Chopsticks();
new Philosopher("0",Chopsticks).start();
new Philosopher("1",Chopsticks).start();
new Philosopher("2",Chopsticks).start();
new Philosopher("3",Chopsticks).start();
new Philosopher("4",Chopsticks).start();
}
}