2012-04-02 10 views
6

はのは、私がスレッドを開始し、私はこのような何かを持っているとしましょう:BufferedReader.readLine()をFuture.cancel(true)で中断できますか?

...//initiate all the socket connection 
future = executor.submit 
( new Runnable() 
    { public void run() 
     { ... 
      ...  
      while ((str = in.readLine()) != null) 
      { //do something here 

      } 

    } 

); 

私はあなたが中断して別のスレッドからソケットを閉じることができます知っているexecutorがExecutorServiceのオブジェクトで、中にはBufferedReaderのオブジェクト

ですこのスレッド。しかし、future.cancel(true)メソッドを使用しようとすると、trueを返しても、スレッドはまだ実行中のように見えますが、なぜ誰が知っていますか?またはin.readLine()はこのように中断することはできませんか?

答えて

10

Future.cancel(true)を使用してBufferedReader.readLine()を中断できますか?

すべてfuture.cancel(true)は、関連するスレッドのthread.interrupt()を呼び出します。これにより、sleep()wait()の操作でInterruptedExceptionがスローされ、いくつかの特殊な割り込みが発生します。NIO channels

「通常の」ソケットまたはファイルから読み取る可能性が最も高いため、BufferedReaderは中断されない可能性があります。あなたが言及したように、異なるスレッドから基礎となるソケットを閉じることは、そのようなIOメソッドを殺すための最良の方法です。

1

readLineは、InterruptedExceptionをスローしないため、実行されるスレッドが中断されても影響を受けません。 readLineを実行しながら、それを中断する唯一の方法は、IOExceptionをスローします基になるストリームを閉じることですがブロック場合

 while ((str = in.readLine()) != null) 
     { 
      if (Thread.interrupted()) { 
       //You can deal with the interruption here 
      } 
     } 

しかし:あなたは明示的にスレッドの割り込み状態を確認する必要があります。

3

ストリームを閉じてIOExceptionをトリガーできます。それ以外の場合、readLine()は永遠にブロックされます。

私はJavaLangAccess.blockedOn()を使用して見ましたが、かなり低レベルです。

関連する問題