) (주

2012-08-31 5 views
0

이 (다른 클래스 내부에) 내의 Runnable 객체입니다) (주

private class StopFileCopy implements Runnable 
{ 
    ObjectInputStream st; 

    public Runnable(ObjectInputStream st) 
    { 
     this.st = st; 
    } 

    public void run() 
    { 
     if(st.read()) 
      stopWritingToFile = true; // stopWritingToFile is an instance variable of the 
             // class that contains this StopFileCopy class 
    } 
} 

이제 문제는 정수가 또는 스트림 '에 기록되지 않을 수 있는지 성'. 그렇지 않다면 클래스 외부에서 즉시이 StopFileCopy 객체를 중지해야합니다. 이것을 어떻게 할 수 있습니까?

+0

왜 Runnable 자체를 중지하지 않는 것이 좋을까요? –

+0

@biovamp, st.read() 메서드는 스트림 'st'에서 정수를 읽으려고 계속합니다. StopFileCopy 클래스에 run() 메서드가 스트림에서 읽는 중 멈추어야한다고 알릴 수있는 방법에 대해 알지 못합니다. –

+1

그냥 '반환'. –

답변

1

정확하게 이해하면 문제가 있다는 것입니다. st.read()은 영원히 차단 될 수 있습니다. 할 수있는 일은 얼마간 경과 한 후에 Thread.interrupt을 호출하여 실행중인 스레드를 인터럽트 할 수 있다는 것입니다. (주 스레드에서 실행 가능한 스레드에서이 작업을 수행하십시오.) 실행 빈을 전달한 FutureTask을 사용하고 get()을 호출하면 시간 초과가 발생합니다. 중단에 중요하다 Is setting a timeout on ObjectInputStream.readObject() safe?


한 가지 더 :
, BTW이 비슷한 질문입니다. 암시 적으로 차단을 멈추지 않으려면 Runnable을 구현하는 대신 Thread을 서브 클래스 화하고 interrupt을 재정 의하여 스트림을 닫은 다음 (super.interrupt) 호출해야합니다. 대안은 다른 스레드에서 스트림을 닫는 것입니다.

+0

멀티 스레딩에 대한 개념이별로 없습니다. 스레드를 인터럽트하는 방법을 알려주시겠습니까? 그리고 어떤 시점에서 쓰레드가 인터럽트되면,'st.read()'메소드도 제대로 작동하지 않을까요? –

+0

감사합니다. 솔루션을 얻었습니다. –

+0

@JisanMahmud : 좀 더 자세히 설명해주세요. – zeller