2012-08-31 73 views
0

這是我的Runnable對象(這是另一個類中):終止從一個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 
    } 
} 

現在的問題是,一個整數可能或可能不被寫入流' ST公司。如果不是,那麼我需要在課堂外立即停止這個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?


一兩說是中斷重要件事。它不會隱式阻止阻塞,您必須子類Thread而不是執行Runnable並覆蓋interrupt以關閉流(然後調用super.interrupt)。另一種方法是關閉其他線程的流。

+0

我沒有很好的有關多線程的概念。你能告訴我如何中斷一個線程?如果某個線程在某個時候中斷了,st.read()方法是否也停止工作? –

+0

謝謝我得到了解決方案。 –

+0

@JisanMahmud:增加了一些細節。 – zeller