2012-04-26 4 views
1

スレッドは1つしか作成されていません。特定の状況下では、シャットダウンする必要があります。 この場合は、isInterrupted()をチェックしてください。しかし、空のInputStreamがある場合はin.readUTF()にフリーズします。どのようにこれを修正することができますか?空のDataInputStreamからのreadUTFのスレッドフリーズ

DataInputStream in; 
.... 
public void stop() { 
thread.interrupt(); 
} 

public void run() { 
    while(true) { 
          String str = in.readUTF();  // locking here, when stream is empty 
          S.o.p(str) 
          if(isInterrupted) { 
          return; 
       }} 
} 

public void main(String args[]) { 
     Thread thread = new Thread();       
} 
+0

スレッドを中断する必要があります。ストリームを閉じ、socket.setSoTimeout(ソケットを使用している場合)または他のタイムアウトを使用可能に設定します(ある時点で変換する可能性があります)。 – bestsss

答えて

2

ブロックされたInputStreamを中断することはできません。 (これはNIOとの違いの1つです)代わりに、割り込みを呼び出す前にストリームを閉じることができます。これはIOExceptionを引き起こします。

public void stop() { 
    in.close(); // or use something like IOUtils.closeQuietly(in); 
    thread.interrupt(); 
} 
+0

すべてのストリームが非同期をサポートするわけではありません。彼らがサポートしていれば、スレッド割り込みもサポートすべきです(SHOULD)。誰でも非同期ハンドラをthread.interruptにインストールすることができます – bestsss

+0

@bestsss私はasynchハンドラを使って見ましたが、それは黒い芸術(内部のみのAPIを使用しています)のように見えます。 –

+0

ええ。それは公共の、公式のAPIです、私はそれを一度投稿しました。それを見つける必要があります。とにかく:* java.nio.channels.spi.AbstractInterruptibleChannel.implCloseChannel *。奇妙なところに置かれていますが、公式のAPIです。いいえ、Javaの秘密または反射。リンク:http://stackoverflow.com/questions/7889161/detecting-thread-interruption-with-jna-native-wait-call-windows – bestsss

関連する問題