2014-04-11 4 views
0

나는 "재생/일시 정지"플래그가 간단합니다. 행위자 스레드를 상상해 플래그가있는 경우에 계속 사실로 플래그 대기, 거짓이 아닌 Java의 부울 세마포

private final Thread backgroundDoer = new Thread(() -> { 
     while(true) { 
      doOperation(); 
      playFlag.await(); 
     } 
}) 

그래서 작업 일을 계속.

제 질문은 Java에서 제대로 수행하는 방법입니다. Condition을 사용할 수는 없습니다. 외부에서 신호를 보내야하기 때문입니다. 지금은 Semaphore을 사용 중입니다. "play"가 눌려지면 많은 허가를 얻습니다. 일시 정지를 누르면 나는 그것들을 모두 버렸습니다. 그것은 clunky와 어리석은 것처럼 보인다. 더 좋은 방법?

+3

대기 ...'Semaphore'에는'await()'메소드가 없습니다. 몇 가지 배경 스레드가 있기 때문에 몇 가지 허가를 사용하는 이유는 무엇입니까? – Kayaman

+0

내가 원하는 것을 실제로 의사 코드가 있습니다. 배경 스레드는 하나뿐입니다. 그래서 세마포어를 사용하지 않으려 고합니다. 단지 한 번 설정할 수있는 조건 일 뿐이지 만 – CarrKnight

+1

에이 사실을 알리기 전까지는 차단되지 않을 것입니다. 이것은 clunky 나 멍청하지 않습니다. 이것은 정확하게 세마포어가 해야하는 것입니다. 유일한주의 사항은 바이너리가 아닌 세마포어 계산이 필요하며 작업은 \t acquire()가 아니라 await()입니다. –

답변

1

단순히 허가 (바이너리 Semaphore 사용)를 획득하고 즉시 해제 할 수 있습니다.

일시 중지되지 않은 경우 작업을 계속 가져오고 반환하면 (호출되면 일시 중지 할 수 있도록 허용) 작업을 계속합니다. 그러나 일시 중지가 발생하면 취득 시도가있을 때 즉시 차단됩니다.

while(true) { 
    doOperation(); 
    semaphore.acquire(); // Block if paused 
    semaphore.release(); // Release immediately, so pause() can acquire() the semaphore 
} 
+1

은 매력처럼 작동합니다. – CarrKnight