2014-02-14 4 views
-2

Я пытаюсь сделать небольшую программу, используя темы, которые имеют 3 пьющих и каждый из них будет пить только если у него есть 3 вещи, указанные в программеНеправильный выход при использовании темы

каждый из них должен начинаться при наличии один из 3-х вещей

Это то, что я так и сделал тариф

import java.util.*; 

import test.Producer.Consumer; 

public class PC { 
    public static void main(String[] args) { 
     AllResource c = new AllResource("water"); 
     AllResource c2 = new AllResource("ice"); 
     AllResource c3 = new AllResource("glass"); 
     Producer p1 = new Producer(c, 1); // One Producer which acting as Server 

     Consumer c1 = new Consumer(c, 1);  // Consumer = Drinker(s) 
     Consumer con2 = new Consumer(c2, 2); 
     Consumer con3 = new Consumer(c3, 3); 


     p1.start(); 
     p1 = new Producer(c2, 2); 
     p1.start(); 
     p1=new Producer(c3, 3); 
     c1.start(); 
     con2.start(); 
     con3.start(); 
     } 
    }  
    class AllResource { 
     private String resource; 
     private boolean avail = false; 
     ArrayList availableReource=new ArrayList(); 

     AllResource(String value){ 
      resource=value;   
     }  
     public boolean getAvail() { 
       return avail; 
     } 
     public void setAvail(boolean avail1) { 
       avail=avail1; 
     } 
     public synchronized String get(String value,boolean a, int number) { 
      vail=a; 

      if (avail == false) { 
       resource=value; 
       try { 
        wait(); 
       } 
       catch (InterruptedException e) { 

       } 
      } 
      else { 
       resource=value; 
       avail = false; 
       notifyAll(); 
      } 
      return resource; 
     } 
     public String getResource() { 
      return resource; 
     } 
     public synchronized void put(String value, boolean a) {  
      avail=a; 
      if (avail == true) { 
       resource=value; 
       try { 
        wait(); 
       } 
       catch (InterruptedException e) { 

       } 
      } 
      else { 
       resource = value; 
       avail = true; 
       notifyAll(); 
      } 
     } 
    } 
    class Producer extends Thread { 
     private AllResource allResource; 
     private int number; 
     String resource[]={"water", "ice", "glass"}; 
     ArrayList al=new ArrayList(); 

     public Producer(AllResource c, int number) { 
      allResource = c; 
      this.number = number; 
      al.add(c.getResource()); 
     } 
     public void run() {   
      while(true) { 
       int rand=0; 
       for(int j=0;j<resource.length;j++) { 
        rand=(int)(Math.random() * 3); 
        if(allResource.getResource()==(resource[rand])) { 
         allResource.put("",true); 
        } 
        else { 
         allResource.put(resource[rand],false); 
        } 
        System.out.println("Server #" + " put: " 
        + resource[rand] + " for Drinker "+this.number); 
       } 
      } 
     } 
     class Consumer extends Thread { 
      private AllResource allResource; 
      private int number; 
      String resource[]={"water", "ice", "glass"}; 

      public Consumer(AllResource c, int number) { 
       allResource = c; 
       this.number = number; 
      } 
      public void run() { 
       while(true) { 
        for(int j=0;j<resource.length;j++) { 
         if(allResource.getResource().equals(resource[j])) { 
          allResource.get("",false,this.number); 
         }  
         else { 
          allResource.get((String)resource[j],true,this.number); 
         } 
         System.out.println("Drinker #" + this.number + " received: " + resource[j]); 
        } 
       } 
      } 
     }  
    } 

Я получаю неправильный выход по какой-то причине Вот часть вывода

Server # put: glass for Drinker 1 
Drinker #3 received: water // drinker #3 received water even though there is no water provided for anyone 
Drinker #3 received: ice // drinker 3 received ice even though there is no ice provided for anyone 
Server # put: ice for Drinker 2 
Drinker #2 received: water // drinker 2 should receive ice not water 
Server # put: glass for Drinker 2 
Drinker #3 received: glass // drinker 2 should receive glass not drinker 3 ! 
Server # put: glass for Drinker 1 
Drinker #1 received: water // it should receive glass not water 
Server # put: ice for Drinker 1 

// and now it's receiving lots of things and the server is not providing anything for him ! 
Drinker #3 received: water 
Drinker #3 received: ice 
Drinker #3 received: glass 
Drinker #3 received: water 

// same thing 
Server # put: water for Drinker 2 
Drinker #2 received: ice 
Drinker #3 received: ice 
Drinker #1 received: ice 

Может кто-нибудь мне помочь? Я не знаю, почему я получаю эти виды логических ошибок

+2

Вы разместили довольно длинный блок кода, и он даже не отступил. Анализ чужого многокритериального кода, когда код даже не отступом, непростая задача. –

+7

Имейте в виду, что при использовании System.out вывод из разных потоков может не отображаться в «правильном» порядке. –

+0

синхронизировать часть, где вы печатаете оставшиеся ресурсы, и посмотреть, что произойдет, чем – Antoniossss

ответ

0

Я не проанализированные коды полностью, но следующий достаточно, чтобы объяснить первую «ошибку» вы получите:

String resource[]={"water", "ice", "glass"}; 

public void run() { 
    while(true) { 
     for (int j = 0; j < resource.length; j++) { 
      // removed irrelevant code 
      System.out.println("Drinker #" + this.number + " received: " + resource[j]); 
     } 
    } 
} 

Так , вы не печатаете, что получает пьяница. Вы печатаете каждый элемент массива, содержащий все три ресурса.

Другая проблема, которую я видел на первый взгляд, заключается в том, что вы не уважаете идиому, которая задана в javadoc Object.wait(), которую всегда следует вызывать в цикле.

Вы не должны использовать wait() и notifyAll(), которые являются сложными, очень низкоуровневыми методами. Используйте совпадающие объекты более высокого уровня из пакета java.util.concurrent, такие как BlockingQueue, которые просты в использовании, хорошо подходят для проблем производителей/потребителей.

+0

Спасибо. Я удалил операторы if в обеих функциях запуска, но у меня все еще есть неправильный вывод. Я хочу использовать wait() и notifyAll(), поэтому я не использовал что-то еще – rullzing

Смежные вопросы