Producer - потребительская реализация с семафорами - PullRequest
0 голосов
/ 29 июня 2019

Предположим, у меня есть следующее:

  • Производители P1, P2.
  • Потребители C1, C2.

C1 должен принимать элементы, которые P1 помещает в буфер, а C2 должен принимать элементы, которые P2 помещает в буфер.

Что может произойти, если C1 или C2 имеют доступ к буферу, но нет элементов, которые они могут потреблять?

Например, C1 получает доступ к буферу, но в нем нет элементов, созданных P1, может ли это привести к livelock?

1 Ответ

0 голосов
/ 29 июня 2019

Идея состоит в том, чтобы спроектировать Consumer и Producer как Thread и использовать структуру данных для их операций с synchronized для блокировки.Вы должны посмотреть Thread класс и как работать с wait-notify.

class DS extends ArrayList<String>
{
   public void synchronized addItem(String item)
   {
       this.add(item);
       notify();
   }
   public String synchronized getItem()
   {
       while(this.size()==0)
       {
            try
            {
              wait();
            }
            catch (InterruptedException e) { }; 
       }
       String out = this.get(0);
       this.remove(0)
       return out;
   }
}
...
class Producer extends Thread {
DS ds;
public Producer(DS ds)
{
    this.ds = ds;
}
...
     public void run()
     { 
        while(true)
        {
              try {Thread.sleep((long) (1000*Math.random()));}
              catch (InterruptedException e){e.printStackTrace();}
              String products[] = {"A", "B" ,"C" , "D" };
              int select = (int)((products.length)*Math.random());
              ds.addItem(products[select]);
              System.out.println("add product:"+products[select]);
        }
     }
...
}
class Consumer extends Thread { ... 
//similar with Producer but this time will get a product on run()
}

class Main
{
    DS ds = new DS();
    Consumer c = new Consumer(ds);
    Producer p = new Producer(ds);
    c.start();
    p.start();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...