2014-06-22 3 views
0

다음 시나리오가 있습니다. 음악을 재생하려고하는 2 명의 DJ가 있지만, 다른 DJ가 동일한 CD를 재생하지 않는 경우에만 분명히 CD를 재생할 수 있습니다. 그 순간 그래서 난 그 클래스와 메신저가 다른 스레드에 대한 CD를 고정 동기화를 사용하려고해야다른 스레드의 일부만 기다리는 중 - Java

public class cd { 
    private boolean played = false;  
    public void play() { 
     this.played = true; 
     Thread.sleep(2000);  
    } 

    //other methods, e.g. skip a song or put the CD back in the collection 

    public boolean isAvailable() { 
     return !(this.played); 
    } 
} 

public class turntable { 
    private boolean used = false; 

    public void use() { 
     this.played = true; 
     Thread.sleep(2000);  
    } 

    public boolean isFree() { 
     return !(this.used); 
    } 

    ... 

} 

DJ 클래스 :

public class DJ implements Runnable { 
    CD disk; 
    Turntable tt; 

    //constructor 

    public void run() { 

     //do something else, e.g. go to the bar 

     tt.use();  
     disk.play(); 
     disk.skipSong(); 
     disk.putBack(); 
     tt.leave(); 

     //do something else, e.g. smoke a cigarette 
    } 
} 

그리고 지금은 현재의 CD를 차단하기 위해 노력하고있어 DJ_1의 경우 DJ_1이이 부분에있는 동안 :

CD를 차단해야합니다 부 : DJ_1 다시 넣어하지만 지금은 담배를 흡연하는 경우

tt.use();  
disk.play(); 
disk.skipSong(); 
disk.putBack(); 
tt.leave(); 

그러나 CD는 분명히 사용할 수 있습니다.

내 질문은 ... 어떻게 스레드의 실행 메서드의 일부만 차단하고 다른 스레드의 동일한 부분과 관련하여 설정할 수 있습니다 (염두에두고 동기화하여 문제를 해결하려고 시도 함))

+1

DJ가 동시에 재생할 수있는 CD인지 아니면 동시에 사용할 수없는 턴테이블인지 직접 물어야한다고 생각합니다. . CD의 –

답변

0

을 재생 방법의 경우 CD 클래스의 부분에서 그 사용 사방

synchronized (tt) { 
    tt.use();  
    synchronized (disk) { 
     disk.play(); 
     disk.skipSong(); 
     disk.putBack(); 
    } 
    tt.leave(); 
} 

그리고 차단해야

public synchronized void play() { 
    while(this.played) { 
     try { 
      wait(); 
     } catch (InterruptedException e) {} 
    } 

    this.played = true; 

    // suppose each DJ can play the disk for 2 seconds and then has to yield the fun to others 
    Thread.sleep(2000); 
    this.played = false; 
    notifyAll();  
} 

다음 각 스레드가 동일한 CD 인스턴스

public static void main(String){ 
    CD cd = new CD(); 

    DJ dj1 = new DJ(); 
    dj1.disk = cd; 
    Thread threadDJ1 = new Thread(dj1); 

    DJ dj2 = new DJ(); 
    dj2.disk = cd; 
    Thread threadDJ2 = new Thread(dj2); 

    threadDJ1.start(); 
    threadDJ2.start(); 
} 
있어야

Java 설명서에 이런 종류의 주제에 대한 좋은 예가 있습니다 Guarded Blocks

+0

while 대신 notifyAll()을 어떻게 사용할 수 있습니까? 아니면 여기서 불가능한가? – user3763900

0

synchronized은 방법 일뿐만 아니라 개체에있을 수 있습니다. 당신 턴테이블과 디스크, 같은 순서로 동기화, 다른 교착 상태에 sync이 & 음악 정차 지점 :

+0

이 아닌 턴테이블을 동기화해야하며, 다른 DJ에게 현재의 디스크가 tt를 남겨두고 CD를 다시 넣으라고 어떻게 말합니까? notifyAll()을 각 블록의 끝에 넣어야합니까? – user3763900