0

나는 여러 날 동안이 문제에 직면 해왔다. 제발 도와주세요. 나는 스레드 동기화를 사용하여 생산자 - 소비자 예제를 구현 중이다. 나는이 전통적인 프로그램에서 몇 가지 비틀기를 만들었다. 하나의 큐 객체 만 사용하는 대신 두 개의 큐 객체를 사용했습니다. 그러나 프로그램이 .. 작동하지 않습니다 (PS-를 난 내가 큐의 하나의 개체를 사용하여이 프로그램 작업을 할 수있어,하지만 난 두 개의 큐를 사용하려면 것은? 객체)여러 객체로 스레드 동기화

클래스 대기열 {

static int value; 

static boolean valueSet = false; 

public static final Object obj; 

static { 

    obj = new Object(); 
} 


void push() { 

    synchronized(Queue.obj) { 

     while(Queue.valueSet) { 

      try { 
      Thread.sleep(1000); 
      }catch(Exception e) {} 
     } 

     System.out.print("\n\n Push:- " + (++(Queue.value))); 
     Queue.valueSet = true; 

     return; 

    } 

} 

void pop() { 

    synchronized(Queue.obj) { 

     while(!(Queue.valueSet)) { 

      try { 
      Thread.sleep(1000); 
      }catch(Exception e) {} 
     } 

     System.out.print("\n\n Pop:- " + Queue.value); 

     Queue.valueSet = false; 

     return; 

    } 

} 

}

클래스 프로듀서의 Runnable {

Queue Q; 
Thread P; 


Producer(Queue Q) { 

    this.Q = Q; 
    P = new Thread(this); 
    P.start(); 

} 

public void run() { 

    while(true) { 

     Q.push(); 

    } 
} 

}

를 구현 클래스 소비자의 Runnable {

Queue Q; 
Thread C; 

Consumer(Queue Q) { 

    this.Q = Q; 
    C = new Thread(this); 
    C.start(); 


} 

public void run() { 

    while(true) { 

     Q.pop(); 

    } 
} 

}

공용 클래스 TestQueue을 {

public static void main(String[] args) { 

    Queue Q1 = new Queue(); 
    Queue Q2 = new Queue(); 

    Object obj = new Object(); 


    Producer p = new Producer(Q1); 
    Consumer c = new Consumer(Q2); 
} 

}

답변

0

나는 대답을 얻었다 구현합니다. 나의 오해는 기다림, notify 및 notifyall 메서드는 스레드 클래스입니다. 그래서 스레드 객체에서 호출하고있었습니다.

솔루션은 thread가 아닌 공유 정적 객체에서 wait 및 notify 메소드를 호출하는 것입니다.

답변 : -

클래스 대기열 {

static int value; 

static boolean valueSet = false; 

public static final Object obj; 

static { 

    obj = new Object(); 
} 


void push() { 

    synchronized(Queue.obj) { 

     while(Queue.valueSet) { 

      try { 
      Queue.obj.wait(); 
      Thread.sleep(1000); 
      }catch(Exception e) { 

       e.printStackTrace(); 
      } 
     } 

     System.out.print("\n\n Push:- " + (++(Queue.value))); 
     Queue.valueSet = true; 
     Queue.obj.notify(); 
    } 

} 

void pop() { 

    synchronized(Queue.obj) { 

     while(!(Queue.valueSet)) { 

      try { 
      Queue.obj.wait(); 
       Thread.sleep(1000); 
      }catch(Exception e) { 

       e.printStackTrace(); 
      } 
     } 

     System.out.print("\n\n Pop:- " + Queue.value); 

     Queue.valueSet = false; 
     Queue.obj.notify(); 
    } 

} 

}

클래스 프로듀서의 Runnable {

Queue Q; 
Thread P; 


Producer(Queue Q) { 

    this.Q = Q; 
    P = new Thread(this); 
    P.start(); 

} 

public void run() { 

    while(true) { 

     Q.push(); 

    } 
} 

}

클래스 소비자의 구현을 구현 실행 가능한 {

Queue Q; 
Thread C; 

Consumer(Queue Q) { 

    this.Q = Q; 
    C = new Thread(this); 
    C.start(); 


} 

public void run() { 

    while(true) { 

     Q.pop(); 

    } 
} 

}

공용 클래스 TestQueue {

public static void main(String[] args) { 

    Queue Q1 = new Queue(); 
    Queue Q2 = new Queue(); 

    Producer p = new Producer(Q1); 
    Consumer c = new Consumer(Q2); 
} 

}