2

次のコードがあります。

public class Net {
    public static void main(String[] args) {        
        Runnable task = new Runnable() {            
            @Override
            public void run() {
                String host = "http://example.example";
                try {
                    URL url = new URL(host);
                    StringBuilder builder = new StringBuilder();                    
                    HttpURLConnection con = (HttpURLConnection) url.openConnection();
                    try(BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()))) {  
                        String line;
                        while (null != (line = in.readLine())) builder.append(line);
                    }           
                    out.println("data: " + builder.length());
                    con.disconnect();
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        };
        Thread thread = new Thread(task);
        thread.start();
        thread.interrupt();
    }
}

ホストが間違っている場合、この「con.getInputStream()」はスレッドをブロックします。このコードを別のスレッドから中断する方法は?

4

4 に答える 4

3

一般的なルールは、「外部」から割り込み不可能なスレッドに割り込むことです。つまり、

  • 接続/ストリームを待機しているスレッド - 接続を閉じることによって。
  • ハングアップ プロセスが終了するのを待っているスレッド - プロセスを強制終了します。
  • (特にこの場合ではありません) 実行中の長いループ - 外部から設定され、ループ内で時々チェックされるブール変数を導入することによって。
于 2013-10-31T13:00:35.733 に答える
1

でタイムアウト値を設定しsetReadTimeoutます。タイムアウトの期限が切れた場合をキャッチし、必要にSocketTimeoutException応じてプログラムを回復または終了します。

于 2013-10-31T12:46:27.090 に答える
0

ホストが間違っている場合、この「con.getInputStream()」はスレッドをブロックします。このコードを別のスレッドから中断する方法は?

これはよくある質問です。スレッドを中断しても、メソッドが中断されることはありません。readLine(...)ここで私の答えから引用するには:

スレッドで割り込みを処理したいのですが、InterruptedException はチェック例外であるためキャッチできません。

t.interrupt() は、スレッドに割り込みビットを設定するだけであることを理解することが重要です。実際には、スレッドの処理自体を中断するわけではありません。スレッドはいつでも安全に中断できます。

したがって、スレッドがブロックされている場合、スレッドを中断する方法はありませんreadLine(...)。ただし、ループを次のように変更できます。

while (!Thread.currentThread().isInterrupted()) {
   String line = in.readLine();
   if (line == null) {
       break;
   }
   builder.append(line);
}

他の人が述べたように、基InputStreamになるものを閉じることができます。これにより、readLine()がスローされExceptionます。

于 2013-10-31T13:24:53.413 に答える