2013-02-26 2 views
4

내가 가진 말 :자바 실행 및 중지 스레드

class WriteThread extends Thread { 
    char letter; 
    boolean stop = false; 
    WriteThread(char letter) { 
     this.letter = letter; 
    } 
    public void halt() { stop = true; } 
    public void run() { 
     while(!stop) { System.out.print(letter); } 
    } 
} 

과 :

WriteThread a = new WriteThread('a'); 
WriteThread b = new WriteThread('b'); 
a.start(); 
b.start(); 
// do some other stuff 
a.halt(); 
b.halt(); // (*) 

두 스레드 (*)가 실행시 중지 보장하고 있는가? (그만 두지 않으면 (*) 뒤에 더 이상 인쇄되지 않을 것임을 의미합니다)

+2

가없는 여러 개의 스레드를 갖고 있기 때문에 "다음에".하지 당신은 또한 휘발유로 정지를 선언해야합니다 – cIph3r

+0

* "(*)"*, 예, 아마도 이후에 더 이상 인쇄되지 않습니다. – MadProgrammer

+0

@MadProgrammer 왜 가능합니까? 정지는 휘발성이 없기 때문에? – Shmoopy

답변

4

'정지'변수를 휘발성으로 만들 필요가 있습니다. 스레드는 vale가 참이라고 판단하면 루핑을 중단하지만 출력 버퍼링이 문제를 혼동시킬 수 있습니다.

+0

여기서 가장 중요한 문제는 "멈춤"이 휘발성인지 여부가 아니라는 것입니다. 'stop'조차도 휘발성이며, 심지어 stdout에 버퍼링이 없다고해도, 마지막 정지 후 출력을 볼 수 있습니다. 내 대답을 참조하십시오. –

0

"정지"변수를 휘발성으로 만드는 것 외에도 코드를 "스레드로부터 안전"하게 만들려면 "정지"에 대한 동기화 된 get/set 메서드를 추가하고이를 사용하십시오 (while 루프에서 "get" "중지"메서드 내부).

여전히 "정지"후에 스레드가 멈출 것이라고 보장 할 수는 없지만 "인쇄물"은 거의 볼 수 없습니다.

이러한 보장을 위해서는 Semaphore과 같은 일종의 "스레드 동기화"메커니즘을 사용해야합니다. 즉, "a.halt()"를 호출하는 스레드가 "a"스레드에게 "a"스레드가 " "while"루프가 효과적으로 종료되고 세마포어를 "해제"할 때까지 루프 및 중지 (내부 중단)됩니다 (따라서 호출 스레드가 실행을 계속 함).

1

물론 아닙니다. 그것은 휘발성과 관련이 없으며 단순히 멀티 스레딩의 특성입니다.

a.halt()를 호출 한 후에는 스레드 a가 실행을 계속할 수 없으며 기본 스레드는 b.halt()를 수행합니다. 그 후, 스레드 a는 여전히 println 문 바로 앞에있을 수 있습니다.

그냥 단순화 된 버전을 보여줄 것입니다 : 당신이 a.halt(), a 여전히 인쇄를 계속하는 기회를 가질 것이라고 후

MAIN THREAD    THREAD A 
          while (!stop) 
a.halt() 
          println(...) 

, EVEN stop 변수는 휘발성이다. 확실히 실을 수 있도록하기 위해

특정 지점 이후에 완료) (조인을 사용하십시오

WriteThread a = new WriteThread('a'); 
WriteThread b = new WriteThread('b'); 
a.start(); 
b.start(); 
// do some other stuff 
a.halt(); 
b.halt(); 
a.join(); 
b.join(); 
// a and b are guaranteed to have finished at this point