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
     }
}

問題は、ストリーム「st」に整数が書き込まれる場合と書き込まれない場合があることです。そうでない場合は、この StopFileCopy オブジェクトをクラスの外部から即座に停止する必要があります。どうすればこれを達成できますか?

4

1 に答える 1

1

私が正しく理解していれば、あなたの問題は、それst.read()が永遠にブロックされる可能性があることです。できることは、ある程度の時間が経過した後にThread.interruptを呼び出すことで、実行中のスレッドを中断できることです。(実行可能なスレッドでメインスレッドからこれを行います。)これに代わる方法は、実行可能なスレッドを渡し、タイムアウトで呼び出すFutureTaskを使用することです。 ところで、これは同様の質問です: Is setting a timeout on ObjectInputStream.readObject() safe?get()


割り込みで重要なことがもう 1 つあります。暗黙的にブロックを停止することはありません。Thread実装する代わりにサブクラス化し、ストリームを閉じるためにRunnableオーバーライドする必要があります (次に を呼び出します)。別の方法は、他のスレッドからストリームを閉じることです。interruptsuper.interrupt

于 2012-08-31T06:37:38.680 に答える