zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    Recommended Books for Algo Trading in 2020
    Market Making is simpler than you think!
    Top Crypto Market Makers of 2020
    Top Crypto Market Makers, Rated and Reviewed
    爬取伯乐在线文章(五)itemloader
    爬取伯乐在线文章(四)将爬取结果保存到MySQL
    爬取伯乐在线文章(三)爬取所有页面的文章
    爬取伯乐在线文章(二)通过xpath提取源文件中需要的内容
    爬取伯乐在线文章(一)
    爬虫去重策略
  • 原文地址:https://www.cnblogs.com/TQCAI/p/7709805.html
Copyright © 2011-2022 走看看