6

スレッドを開始し、次のようなものがあるとします。

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

            }

    }

 );

executorはExecutorServiceオブジェクトであり、inはBufferedReaderオブジェクトです。

別のスレッドからソケットを閉じて、このスレッドを中断できることを知っています。しかし、future.cancel(true)メソッドを使おうとすると、trueが返されても、スレッドはまだ実行されているように見えます。理由は誰にもわかりません。またはin.readLine()をこの方法で中断することはできませんか?

4

3 に答える 3

10

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

関連するスレッドでfuture.cancel(true)呼び出すだけです。thread.interrupt()これによりsleep()wait()操作がスローされ、いくつかの特別なNIO チャネルInterruptedExceptionが中断されます。

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

于 2012-04-02T15:50:25.383 に答える
3

インストリームを閉じて IOException をトリガーできます。そうしないと、readLine() が永久にブロックされる可能性があります。

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

于 2012-04-02T15:56:01.853 に答える
1

readLineスローしないInterruptedExceptionため、実行中のスレッドが中断されても影響を受けません。スレッドの中断ステータスを明示的に確認する必要があります。

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

しかし、実行中にブロックした場合、それreadLineを中断する唯一の方法は、IOException をスローする基になるストリームを閉じることです。

于 2012-04-02T15:51:04.760 に答える