2016-04-17 4 views
-1

私はIO操作が多いためにハングしているスレッドをkillしようとしています。 私はthread.destroythread.stopを試してみましたでしたが、彼らは例えば を推奨されていませんがコードの下でどのようにJavaでハングスレッドを殺す

public class ThreadCheck { 
private static int cnt = 0; 
public static void main(String args[]) throws InterruptedException, ExecutionException { 
    Thread t1 = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      System.out.println("Running tasks"); 
      while (condition)        { 
       // **** Some IO operation that take forever ****     
       System.out.println("iteration " + cnt++); 
       if (Thread.currentThread().isInterrupted()) { 
        System.out.println("Breaking loop"); 
        return; 
       } 
      }   
     } 
    }); 
    t1.start(); 
    TimeUnit.SECONDS.sleep(5); 
    t1.interrupt(); 
    System.out.println("thread destroyed.."); 

    } 
} 

問題は、私はinterruptコールを追加した表情をされているが、それはIOの呼び出しを終了したことがないので、私はそのようにスレッドを殺すことができますケース

+1

正確なIO操作によって異なります。例えば、 'InterrptibleChannel'を使うようにコードを変更することができれば、必要なものを達成することができます。とにかく、IO操作は、これが解決可能であるために不可欠です。 – RealSkeptic

+0

うん、彼は何を言ったか^^ ^^! –

+0

@RealSkeptic私はいくつかのCSVファイルを読み込み、それらのデータをデータベースに挿入していますが、これらのCSVファイルが壊れてIOコールが終了しないことがあります。この場合、Javaはunix killコマンドのようにスレッドをkillできます。 – Nomad

答えて

0

はこのpageに記載されたこの技術に従うことをお試しください:

私はFOを待つスレッドをどのように停止します長期間(例えば、入力のために)?

これは、Thread.interruptメソッドの目的です。上に示した同じ「状態ベース」 シグナリングメカニズムを使用することができるが、(前の例でウインカー=ヌル)状態変化 待機を中断し、 Thread.interruptへの呼び出しが続くことができる:

この手法が機能するために
public void stop() { 
    Thread moribund = waiter; 
    waiter = null; 
    moribund.interrupt(); 
} 

、それは 割り込み例外をキャッチし、それに対処する準備ができていない任意の方法がすぐに が例外を再アサートすることが重要です。私たちは、再スローされるよりもむしろ、再スローされると言っています。 例外を元に戻すことは常に可能ではないためです。例外:InterruptedExceptionをキャッチ 方法は、これ(チェック)例外 をスローするように宣言されていない場合、それは 以下の呪文を「自分自身をreinterrupt」必要があります。

Thread.currentThread().interrupt(); 

をこれは、スレッドがするようになりますInterruptedExceptionをできるだけ早く と再発行してください。

スレッドがThread.interruptに応答しない場合はどうなりますか?

場合によっては、アプリケーション固有の技を使用できます。たとえば、 スレッドが既知のソケットで待機している場合は、ソケットを閉じて にして、スレッドをすぐに戻すことができます。残念ながら、実際には は一般的に動作する技術ではありません。 では、待ちスレッドが Thread.interruptに応答しないすべての状況で、Thread.stopにも応答しないことに注意してください。そのような の場合には意図的なサービス拒否攻撃と、thread.stopとthread.interruptが正しく機能しない のI/O操作が含まれます。

関連する問題