2015-10-22 3 views
1

SharedresourceProducer/Consumer многопоточный код не работает, как ожидалось класса

class Sharedresource { 
     private int contents; 
     private boolean available = false; 

     public synchronized int get() { 
      while (available == false) { 
       // System.out.println("sharedresorce,while(false)"); 
       try { 
        // /System.out.println("sharedresorce,while(false)object block"); 
        wait(); 
        // System.out.println("sharedresorce,while(false)object relise"); 
       } catch (Exception e) { 
        // System.out.println("Thread Interrupted"); 
       } 
      } 
      available = false; 
      notify(); 
      return contents; 
     } 

     public synchronized void set(int value) { 
      while (available == true) { 
       try { 
        wait(); 
       } catch (Exception e) { 
        System.out.println("Thread Interrupted"); 
       } 
      } 
      contents = value; 
      available = true; 
      notify(); 
     } 
    } 

Produser класс

class Produser extends Thread { 
     private Sharedresource resource; 
     private int number; 

     Produser(Sharedresource s, int number) { 
      resource = s; 
      this.number = number; 
     } 

     @Override 
     public void run() { 
      for (int i = 1; i <= 10; i++) { 
       resource.set(i); 
       System.out.println("produser#" + this.number + "set:" + i); 
       // try{ 
       // sleep(2000); 
       // } 
       // catch (Exception e) { 
       // System.out.println("tread intrupted"); 
       // } 
      } 
     } 
    } 

потребительского класса

class Consumer extends Thread { 
     private Sharedresource resource; 
     private int number; 

     public Consumer(Sharedresource s, int number) { 
      resource = s; 
      this.number = number; 
     } 

     int value = 0; 

     @Override 
     public void run() { 
      for (int i = 1; i <= 10; i++) { 
       value = resource.get(); 
       System.out.println("Consumer#" + this.number + "getvalue:" + value); 

      } 
     } 
    } 

Основной класс

public class SynchronizatonDemo121 { 

     public static void main(String[] args) { 
      Sharedresource r = new Sharedresource(); 
      Produser p = new Produser(r, 1); 
      Consumer c = new Consumer(r, 1); 
      p.start(); 
      c.start(); 

     } 

    } 

выход-1

Consumer#1getvalue:1 
produser#1set:1 
produser#1set:2 
Consumer#1getvalue:2 
produser#1set:3 
Consumer#1getvalue:3 
produser#1set:4 
Consumer#1getvalue:4 
produser#1set:5 
Consumer#1getvalue:5 
produser#1set:6 
Consumer#1getvalue:6 
Consumer#1getvalue:7 
produser#1set:7 
produser#1set:8 
produser#1set:9 
Consumer#1getvalue:8 
Consumer#1getvalue:9 
produser#1set:10 
Consumer#1getvalue:10      

Выход 2-

produser#1set:1 
produser#1set:2 
Consumer#1getvalue:1 
Consumer#1getvalue:2 
produser#1set:3 
Consumer#1getvalue:3 
produser#1set:4 
Consumer#1getvalue:4 
produser#1set:5 
Consumer#1getvalue:5 
produser#1set:6 
Consumer#1getvalue:6 
produser#1set:7 
Consumer#1getvalue:7 
produser#1set:8 
Consumer#1getvalue:8 
produser#1set:9 
Consumer#1getvalue:9 
produser#1set:10 
Consumer#1getvalue:10 

выход-3

produser#1set:1 
Consumer#1getvalue:1 
Consumer#1getvalue:2 
produser#1set:2 
produser#1set:3 
Consumer#1getvalue:3 
produser#1set:4 
Consumer#1getvalue:4 
produser#1set:5 
Consumer#1getvalue:5 
produser#1set:6 
Consumer#1getvalue:6 
Consumer#1getvalue:7 
produser#1set:7 
produser#1set:8 
Consumer#1getvalue:8 
Consumer#1getvalue:9 
produser#1set:9 
produser#1set:10 
Consumer#1getvalue:10 

мои темы не работают должным образом в соответствии с поведением производителей и потребителей. Я приложил свой вывод туда для понимания теста, так где проблема в моем коде, пожалуйста, подтвердите меня, заранее заблаговременно

ответ

1

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

Если вы перемещаете ваши println заявления синхронизированных get и set методы:

public synchronized int get() { 
     while (available == false) { 
      // System.out.println("sharedresorce,while(false)"); 
      try { 
       // /System.out.println("sharedresorce,while(false)object block"); 
       wait(); 
       // System.out.println("sharedresorce,while(false)object relise"); 
      } catch (Exception e) { 
       // System.out.println("Thread Interrupted"); 
      } 
     } 
     available = false; 
     notify(); 
     System.out.println("Consumer#" + "getvalue:" + contents); 
     return contents; 
    } 

    public synchronized void set(int value) { 
     while (available == true) { 
      try { 
       wait(); 
      } catch (Exception e) { 
       System.out.println("Thread Interrupted"); 
      } 
     } 
     contents = value; 
     available = true; 
     System.out.println("produser#" + "set:" + value); 
     notify(); 
    } 

вы получите ожидаемый результат:

produser#set:1 
Consumer#getvalue:1 
produser#set:2 
Consumer#getvalue:2 
produser#set:3 
Consumer#getvalue:3 
produser#set:4 
Consumer#getvalue:4 
produser#set:5 
Consumer#getvalue:5 
produser#set:6 
Consumer#getvalue:6 
produser#set:7 
Consumer#getvalue:7 
produser#set:8 
Consumer#getvalue:8 
produser#set:9 
Consumer#getvalue:9 
produser#set:10 
Consumer#getvalue:10 
+0

вы имеете в виду в печать до линии нитей высвобождают замок и другие потоки начинают работать, но я проверил с применением методов сна перед печатью, тогда почему другой поток ждет завершения сна, почему его не выполняет свою работу ниже, это пример кода – sarvoday

+0

класс Produser extends Thread { \t частный ресурс Sharedresource; \t частный номер int; \t Produser (Sharedresource s, int number) { \t \t Ресурс = s; \t \t это.число = число; \t} \t \t @Override общественного недействительными запуска() { \t \t для (INT = 1; г <= 10; я ++) { \t \t \t resource.set (я); \t \t \t попробовать { \t \t \t \t Thread.sleep (10000); \t \t \t} задвижка (InterruptedException е) { \t \t \t \t // TODO автоматическая генерация улова Блокировать \t \t \t \t e.printStackTrace(); \t \t \t} \t \t System.out.println ("produser #" + this.number + "set:" + i); – sarvoday

+0

@sarvoday Вы не можете полагаться на время сна для синхронизации. Если вы хотите, чтобы печать была синхронизирована, она должна выполняться в синхронизированных методах/блоках. Ваша синхронизация обеспечила, чтобы ваши потоки выполняли свою работу в правильном порядке, но они не печатали свой вывод в правильном порядке. – Eran

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