2012-03-25 4 views
1

필자가 작성한 Runnable 클래스가 있습니다. 그 안에는 두 가지 방법이 있습니다. run() 메서드 및 stopRunning()이라는 메서드가 있습니다. stopRunning()은 run() 메서드를 실행하는 스레드와 별도의 스레드에 의해 호출되며 run() 메서드를 실행하는 스레드가 실행되지 않도록합니다.Java Threads - 다른 스레드를 통해 스레드가 실행되는 것을 중지하여 메서드 호출하기

public class myRunnable implements Runnable 
{ 
    private boolean stillRunning = true; 

    public void stopRunning() 
    { 
     synchronized (this) 
     { 
      stillRunning = false; 
     } 
    } 

    public void run() 
    { 
     while (stillRunning) 
     { 
      synchronized (this) 
      { 
      // do some stuff that doesn't involve the isPlaying var 
      } 
     } 
    } 

}

이 코드는 올바른 보입니까 :

여기에 코드입니다? isPlaying의 변경이 run() 메소드를 실행하는 스레드에 의해 인식 될 수 있도록 동기화해야합니까?

또한이 기능을 사용하려면 여기 어디에서나 notify() 또는 notifyAll()을 호출해야합니까? 나는 결코 wait()를 호출하지 않았기 때문에 내가하지 않는다고 확신하지만, 나는 100 % 확실하지 않다.

편집 : 내 코드가 잘못되었습니다. 부울에 대해 잘못된 이름을 사용했습니다. 죄송합니다. 이제 해결되었습니다.

+0

멤버 isPlaying과 isRunning을 선언하겠습니까? – seand

+0

예, 혼란에 대해 죄송합니다. 방금 바꿨어. – Tim

답변

3

및 스레드 중지에 대한이 링크를 확인이 링크와 같은 휘발성 변수 무언가로 stillRunning을 선언해야 Java Thread API은 찾고있는 기능을 이미 제공합니다. Thread.interrupt()Thread.interrupted()은 원하는 것을 얻기 위해 사용할 수 있습니다.

public class MyThread extends Thread{ 
    public void run(){ 
    while(!interrupted()){ 
     try{ 
     // Place your code here 
     }catch(InterruptedException e){ 
     break; 
     } 
    } 
    } 
} 

방금 ​​신뢰성 MyThread.interrupt()

1

더 많은 기능을 추가하면 나중에 동기화 문제가 발생하지 않는 더 간단한 대안은 sillRunningvolatile으로 간단히 선언하는 것입니다.

여러분이 말했듯이, nofity()는 wait와 함께 사용할 때만 유용합니다. 여기에서하는 일과는 아무 상관이 없습니다.

0

전화 MyThread을 중단 할 때마다, 당신은 'stillRunning'변수에 일부 MT 보호를 적용해야합니다. 당신은 이것을 다른 것과 같이 휘발성으로 만들 수 있습니다. 또는 동기화 된 블록으로 래핑 할 수 있습니다. 'stillRunning'을 설정/확인하는 것 외에 다른 일이 필요할 경우 유용 할 수 있습니다.

MT 보호 기능이 없으면 과부하가 걸리지 않는 단위 테스트와 같은 코드에서 코드가 작동하는 것처럼 보일 수 있습니다. 그러나 생산 환경에서는 신뢰할 수 없습니다.

notify(), notifyAll(); 이것은 차단 된 스레드를 깨우고 상태를 확인하도록 신호를 보내는 데 사용됩니다. 귀하의 모범은 이것을 필요로하지 않습니다. 요즘 notify()/wait()는 꽤 낮은 수준으로 간주되며 Java는이를 처리 할 수있는 스레딩 API (예 : 래치)를 가지고 있습니다.

+0

죄송합니다. MT 보호 란 무엇입니까? – Tim

+0

MT : 멀티 스레딩. – seand