Java实现PV操作 | 哲学家进餐问题

运行结果:

 

Java代码:

 1 public class Main {
 2 
 3     public static void main(String[] args) {
 4         Global global=new Global();
 5         
 6         philosopher ph[]=new philosopher[5];
 7         int i;
 8         for(i=0;i<5;i++){
 9             ph[i]=new philosopher(i);
10         }
11         Thread[] ph_t=new Thread[5];
12         for(i=0;i<5;i++){
13             ph_t[i]=new Thread(ph[i]);
14         }
15         for(i=0;i<5;i++){
16             ph_t[i].start();
17         }
18     }
19 }
20 
21 
22 class syn{//PV操作类
23     int count=0;//信号量
24     syn(){}
25     syn(int a){count=a;}
26     public synchronized void Wait(){ //关键字 synchronized 保证了此操作是一条【原语】
27         count--;
28         if(count<0){//等于0 :有一个进程进入了临界区
29             try {         //小于0:abs(count)=阻塞的进程数目
30                 this.wait();
31             } catch (InterruptedException e) {
32                 e.printStackTrace();  
33             }  
34         }  
35     }  
36     public synchronized void Signal(){   //关键字 synchronized 保证了此操作是一条【原语】
37         count++;
38         if(count<=0){//如果有进程阻塞
39             this.notify();//All
40         }
41     }  
42 }
43 
44 class Global{
45     static syn chopsticks[]=new syn[5];
46     static int count=0;
47     Global(){
48         int i;
49         for(i=0;i<5;i++){
50             chopsticks[i]=new syn(1);//初始化信号量
51         }
52     }
53 }
54 
55 class philosopher implements Runnable{//哲学家类
56     int ID=0;
57     philosopher(){}
58     philosopher(int id){
59         ID=id;
60     }
61     public void run(){
62         while(true){//Global.count<20
63             //拿起左筷子
64             Global.chopsticks[ID].Wait();
65             Global.chopsticks[(ID+1)%5].Wait();
66             
67             Global.count++;
68             System.out.println("哲学家"+ID+"拿起了筷子"+ID+"和筷子"+((ID+1)%5)+"美餐了一顿");
69             try {
70                 Thread.sleep(10);
71             } catch (InterruptedException e) {
72                 // TODO Auto-generated catch block
73                 e.printStackTrace();
74             }
75             
76             Global.chopsticks[ID].Signal();
77             Global.chopsticks[(ID+1)%5].Signal();
78         }
79     }
80 }

 

转载于:https://www.cnblogs.com/TQCAI/p/7709805.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值