2014-11-02 1 views
0

이 코드는 main에 여러 개의 오류를줍니다. 누군가가 나에게 뭐가 잘못 됐는지 말해 줄 수 있니? 첫 번째 포스터이므로 부드럽게하십시오.멀티 스레딩에 잠긴 java

질문은 램프를 만들 소비자 및 생산자 스레드를 만드는 것입니다.

StartProducer startproducer = new StartProducer(); 

Consumer1 생성되는 : 두 소비자는

주에서
public class ProducerConsumerTest{ 




    public static void main(String[] args){ 

     StartProducer startproducer = new StartProducer(); 
     System.out.println("Start producer calling"); 
     startproducer.start(); 


    } 
} 
class StartProducer extends Thread{ 

    Screw screw = new Screw(); 
    Base base = new Base(); 
    Stand stand = new Stand(); 
    Socket socket = new Socket(); 
    LightBulb lightbulb = new LightBulb(); 
    int screws = screw.screwcount; 
    int bases = base.basecount; 
    int stands = stand.standcount; 
    int sockets = socket.socketcount; 
    int lightbulbs = lightbulb.bulbcount; 
    Consumer1 consumer1 = new Consumer1(); 
    Consumer2 consumer2 = new Consumer2(); 
    public synchronized void run(){ 

     System.out.println("producer test"); 

      screw.start(); 


      base.start(); 


      stand.start(); 


      socket.start(); 


      lightbulb.start(); 




     boolean possible = possibleToBuildLamp(screws,bases,stands,sockets,lightbulbs); 
     if(possible == true){ 
      consumer1.start(); 
      consumer2.start(); 

     } 
    } 

    private boolean possibleToBuildLamp(int screws, int bases, int stands, 
      int sockets, int lightbulbs) { 
     if(screws>=4 && bases>=1 && stands>=1 && sockets>=3 && lightbulbs>=3){ 
      return true; 
     } 

     else return false; 
    } 

} 
class Screw extends Thread{ 

    public int screwcount; 
    public synchronized void run(){ 
     while(true){ 
     if(screwcount>=0 && screwcount<7){ 
      screwcount++; 
     } 
     try { 
      wait(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

} 
} 

class Base extends Thread{ 
    public int basecount; 
    public synchronized void run(){ 

    while(true){ 
     if(basecount>=0 && basecount <2){ 
      basecount++; 
     } 
     try { 
      wait(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

} 
} 

class Stand extends Thread { 
    public int standcount; 
    public synchronized void run(){ 

    while(true){ 
     if(standcount>=0 && standcount<2){ 
      standcount++; 
     } 
    } 

} 
} 

class Socket extends Thread { 
    public int socketcount; 
    public synchronized void run(){ 

    while(true){ 
     if(socketcount>=0 && socketcount<7){ 
      socketcount++; 
     } 
     try { 
      wait(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

} 
} 

class LightBulb extends Thread { 
    public int bulbcount; 
    public synchronized void run(){ 

    while(true){ 

     if(bulbcount>=0 && bulbcount<4){ 
      bulbcount++; 
     } 
     try { 
      wait(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

} 
} 



class Consumer1 extends Thread { 
    ProducerConsumerTest test = new ProducerConsumerTest(); 
    StartProducer start = new StartProducer(); 


    public synchronized void run(){ 
     while(true){ 
     Screw screw = new Screw(); 
     Base base = new Base(); 
     Stand stand = new Stand(); 
     Socket socket = new Socket(); 
     LightBulb lightbulb = new LightBulb(); 

     screw.screwcount-=4; 
     base.basecount-=1; 
     stand.standcount-=1; 
     socket.socketcount-=3; 
     lightbulb.bulbcount-=3; 
     System.out.println("one lamp made"); 
     start.notify(); 

     try { 
      wait(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     } 


    } 


} 

class Consumer2 extends Thread { 
ProducerConsumerTest test = new ProducerConsumerTest(); 
StartProducer start = new StartProducer(); 

    public synchronized void run(){ 

     while(true){ 
     Screw screw = new Screw(); 
     Base base = new Base(); 
     Stand stand = new Stand(); 
     Socket socket = new Socket(); 
     LightBulb lightbulb = new LightBulb(); 

     screw.screwcount-=4; 
     base.basecount-=1; 
     stand.standcount-=1; 
     socket.socketcount-=3; 
     lightbulb.bulbcount-=3; 
     System.out.println("One lamp made"); 
     start.notify(); 
     try { 
      wait(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 



     }  

    } 

} 
+3

* "처음으로 포스터 이렇게 부드럽게하십시오"* - 부드럽게 : "이 코드는 메인에 여러 개의 오류가 있습니다"라고 말하면서 오류가 무엇인지 또는 적어도 오류의 종류는 무엇인지 말해야합니다 아르. –

답변

0

당신이 StartProducer 만들 수 램프의 모든 구성 요소에 대한 프로듀서 스레드를 프로그래머된다

Consumer1 consumer1 = new Consumer1(); 

을하는 다른 새로운 것을 만듭니다. StartProducer :

StartProducer start = new StartProducer(); 

새롭게 새로운 Consumer1을 만듭니다. StackOverlowError를 병에 넣을 때까지 Consumer1을 생성하는 무한한 StartProducer 라인을 만드는 데 막혀 있기 때문에 다른 작업을 수행 할 수 없습니다. 마찬가지로 Consumer2에 대해, 그것들을 생성하는 것이 가능하다면.

StartProducer 개체를 하나만 만들고 싶다면 한 곳에서 만들어야하며 생성자에 매개 변수를 지정하거나 배치하는 등 개체를 필요로하는 다른 개체에 참조를 전달해야합니다 그들이 액세스 할 수있는 공유 변수.

P. 스레드의 run() 메소드는 모두 synchronized입니다. 이는 모든 스레드가 다른 객체 (즉, 스레드 자체)에서 동기화되므로 상호 배타를 수행하지 않습니다. 유용한 상호 배제를 제공하려면 synchronized statement을 사용하여 여러 스레드에서 공유하는 특정 객체를 동기화해야합니다.