3

これは簡単なテスト プログラムです。メイン スレッドは、いくつかの子スレッドを開始します。メインに追加しました: Runtime.getRuntime().addShutdownHook(hookThread);

JVM プロセスで ^C が押されると、この hookThread はグローバル シャットダウン フラグを設定し、すべての子スレッドに対して interrupt() を呼び出します。

その後、すべての子スレッドを返したいのですが、HttpURLConnection.getInputStream() にある場合、interrupt() は子スレッドに対して何もしません。子スレッドはタイムアウト (30 秒) 後に戻りますが、これは私には遅すぎます。

HttpURLConnection.getInputStream() 呼び出しを即座に中断する最良の方法は何ですか?

interrupt() が呼び出された後、子スレッドのスタックの一番上をたどります。

"Thread-0" prio=10 tid=0x0000000040b0f800 nid=0x3eab runnable [0x000000004211b000]
   java.lang.Thread.State: RUNNABLE
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.read(SocketInputStream.java:129)
        at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
        at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
        at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
        - locked <0x00000000fd99ac88> (a java.io.BufferedInputStream)
        at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:687)
        at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:632)
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1195)
        - locked <0x00000000fd997670> (a sun.net.www.protocol.http.HttpURLConnection)
...
4

2 に答える 2

1

この通話を中断することはできません。

呼び出しを行う前にタイムアウトを短く設定するか、NIO パッケージを介して割り込み可能な I/O をサポートする HTTP クライアント ライブラリを見つけることができます。

また、自分が所有するスレッドのみを中断する必要があります。プロセス内のすべてのスレッドを作成し、それらが割り込みにどのように応答するかを理解していれば問題ありませんが、それ以外の場合、やみくもにスレッドに割り込むのは危険です。

于 2012-04-06T01:49:58.367 に答える
1

おそらくストリームを閉じる必要があります。Java バグ#4514257により、InputStream.read() での Thread.interrupt() の呼び出しが失敗します。

于 2012-04-05T23:52:11.843 に答える