2015-04-14 2 views
-2

Выхода:синхронной Темы Mixed Up

Produced food '20' 
Produced food '19' 
Eaten food '20' 
Eaten food '19' 
Eaten food '18' 
Produced food '18' 
Produced food '17' 
Eaten food '17' 
Produced food '16' 
Eaten food '16' 
Produced food '15' 
Eaten food '15' 
Produced food '14' 
Eaten food '14' 
Produced food '13' 
Eaten food '13' 
Produced food '12' 
Eaten food '12' 
Eaten food '11' 
Produced food '11' 
Produced food '10' 
Eaten food '10' 
Produced food '9' 
Eaten food '9' 
Produced food '8' 
Eaten food '8' 
Produced food '7' 
Eaten food '7' 
Produced food '6' 
Eaten food '6' 
Eaten food '5' 
Produced food '5' 
Produced food '4' 
Eaten food '4' 
Produced food '3' 
Eaten food '3' 
Produced food '2' 
Eaten food '2' 
Produced food '1' 
Eaten food '1' 
Produced food '0' 
Eaten food '0' 

Я хочу ОДНА пищи производить ТОГДА одну пищи потреблять в последовательности

Код:

int times =0; 
// read `times` using input 

while(times < 20 || times > 100) { 
    if (times < 3000) { 
     System.out.println("No less than 3000! I am hungry"); 
     times = (int) cin("----->How much i should eat? in numbers?"); 
    } 
    if(times > 20000){ 
     System.out.println("I cant eat that much!"); 
     times = (int) cin("----->How much i should eat? in numbers?"); 
    } 
} 
food me = new food(); 
me.eat(times); 

Код класса:

class food{ 

    public int times; 
    public int food; 
    public boolean canget=false; 

    void eat(int times){ 

     this.times = times; 
     producer p = new producer(); 
     p.produce(this); 
     consumer pe = new consumer(); 
     pe.consume(this); 


    } 

    synchronized void add(int n){ 
     while(canget) { 
      try { 
       wait(); 
      } catch (Exception e) { 
       System.out.println("Something nasty happened"); 
      } 
     } 

     this.food = n; 
     canget = true; 
     notify(); 
    } 
    synchronized int get(){ 
     while (!canget){ 
      try{ 
       wait(); 
      }catch (Exception e) { 
       System.out.println("Something Nasty happened"); 
      } 
     } 
     canget = false; 
     notify(); 
     return this.food; 
    } 
} 

class producer implements Runnable{ 
    int times; 
    food f; 

    void produce(food F){ 
     times=F.times; 
     f=F; 
     Thread t = new Thread(this); 
     t.start(); 
    } 

    public void run() { 
     while(this.times-- > 0){ 
      f.add(times); 
      System.out.println("Produced food '"+times+"'"); 
     } 
    } 
} 

class consumer implements Runnable{ 

    int times; 
    food f; 

    void consume(food F){ 
     times=F.times; 
     f=F; 
     Thread t = new Thread(this); 
     t.start(); 
    } 

    public void run() { 
     while(this.times-- > 0){ 
      f.get(); 
      System.out.println("Eaten food '"+times+"'"); 
     } 
    } 
} 

Пример вывод:

Produced food '20' 
Consumed food '20' 
Produced food '19' 
Consumed food '19' 
......... 
+1

Обратитесь к конкретной проблеме, пожалуйста. Кроме того, что вы пробовали с точки зрения отладки? Никто здесь не ценит то, что * бросил * кучу кода ... – Zizouz212

+1

Я подозреваю, что ваш код работает нормально - одна пища производится, а затем одна пища потребляется в замке. Однако, когда вы выписываете сообщение, информирующее пользователя об этом, вы пишете его вне синхронизированного метода, поэтому сообщения перемешиваются, даже если есть нет. –

+0

@thatotherguy Спасибо, теперь он отлично работает. Я приму свой ответ – user4785230

ответ

1

Похоже, что ваш код работает отлично - одна еда произведена, а затем одна пищи потребляется в ноге.

Однако, когда вы выписываете сообщение, информирующее пользователя об этом, вы пишете его вне синхронизированного метода, поэтому сообщения перемешиваются, даже если есть нет.

Если вы перемещаете печать по синхронизированному методу или синхронизируете как вызов, так и печать, он также должен печатать в замке.