• 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 }
  • 相关阅读:
    生成一个平面矩形网格文件
    生成球 使用openMesh 库
    U盘安装可能会遇见UEFI的问题,使用easyBCD安装即可。
    vs 代码格式化
    跨域问题的出现和解决
    代理服务器的作用 和 推荐
    sublime user 配置
    git 大佬的相关配置
    win10 注册
    【BZOJ3566】—概率充电器(树形+概率dp)
  • 原文地址:https://www.cnblogs.com/TQCAI/p/7709805.html
Copyright © 2020-2023  润新知