2012-03-07 7 views
0

メモリリーク、アプリケーションでロックされたリソースによってハングしたスレッドを処理するソリューションを作成しようとしています。私が抱えている主な問題の1つは、それに対処するためにハングしたスレッドをシミュレートしようとすることです。すべての訴訟?Javaスレッドをハングする方法

これは私が試したものですが、仕事をしていないようです。何かご意見は?

class KillerThread extends Thread{ 

    public KillerThread() { 
     super(); 
    } 
    public KillerThread(String threadName) { 
     super(threadName); 
    } 
    public void run(){ 
     System.out.println("Start of KillerThread " + this.getName()); 
     if (System.currentTimeMillis() % 2L == 0){ 
      try { 
       sleep(Long.MAX_VALUE); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } else { 
      for(;;); 
     } 
    } 
} 
+1

あなたは私のためにhttp://stackoverflow.com/questions/3203139/how-do-you-hang-a-thread-in-java-in-one-line – naresh

+0

作品をチェックしました。どのようにスレッドを開始していますか? – adarshr

+1

「ハング」とはどういう意味ですか?あなたは 'interrupt()'でも何もしないことを意味しますか? –

答えて

1

は次のようにwhileループで実行中の睡眠をしてみてください。止められないループの中で眠りにそれを伝え、スレッドを実行している

while(true) { 
    try { 
     Thread.sleep(1000); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 
+0

私のIDEは私に警告メッセージ 'Thread.sleep in loop'を与えますか? – ThreaT

+0

うわー、古い答え!一般的にループで寝ているええ、パフォーマンスが低下します。あなたのIDE(netbeans)はこれについて警告を出します。質問のために、これは無視することができます。 – Terraego

0

、良いアイデアです、。 しかし、別のスレッドを待たせる方法は?複数のスレッドを作り、それらをお互いに待つようにする、デッドロック状態、に掛かっていること。単純に十分な

0

、ちょうど

while (true) { 
    try { 
     synchronized (lock) { 
     lock.wait(); 
     } 
    } cath (InterruptedException e) { 
     /* ignore interruption */ 
    } 
} 

(あなたはリフレクションを使用しない限り、それは、決して起こらないだろう...)通知を待つためにそれを使用し、その後

private Object lock = new Object(); 

プライベートメンバを作成し、スレッドは、中断されずにハングします。

+0

'UninterruptedException'?スレッドが途切れていないときにスローされますか? ;-) – Jesper

+0

笑、はい、:)私は最近私は中断されていない睡眠をしたいと思います! –

0

私はあなたが正確に必要なものを知っています。エグゼクティブスレッドを停止して何かをテストしています。

private void testKillingThread() { 
    Object kill = new Object(); 
    try { 
     synchronized (kill) { 
      kill.wait(); 
     } 
    } catch (Exception e) { 
     // Auto-generated catch block 
    } 
} 
+0

あなたは 'while(true){kill.wait();を使う必要があります。 } '偽の目覚めを防ぐためです。参照してください:http://stackoverflow.com/a/3203164/257299 – kevinarpe

+0

@kevinarpeしかし、これは同期で保護されている場合どのように可能です – GingerHead

+0

良い質問。疑似ウェークアップは非常に複雑です(!)。 'SIGUSR1'のような伝統的なPOSIXシグナルが(killコマンドラインツールを介して)プロセスに送られたとします。 POSIXルール(AFAIK)によって、カーネルはスリープ/待機中のスレッドをそれぞれウェイクアップし、着信信号を通知します。これは、待機条件が満たされている場合に、プログラマが述語(ブーリアンの場合)をチェックする必要がある理由の典型的なケースです。 JVM +のシグナルについての参考情報:http://www.oracle.com/technetwork/java/javase/signals-139944.html – kevinarpe

0

ここで私はテストのために使用していますクイックフィックスがあります:このような何かを試してみてください。ロックしたいスレッドをnew Hanger().hang()にしてください。

あなたが見たいと思わない場合は、ログを削除してください。コードを変更しなくても、Thread.sleep()new Hanger().hang()に置き換えるだけで、throws InterruptedExceptionを追加することができます(実際は決してありません)。

public class Hanger { 

    private final static Logger log = Logger.getLogger(Hanger.class); 
    private long started = 0; 
    private final int beat = 100; // ms 

    /** 
    * Hangs a thread for the indicated time 
    * @param millis the amount of time to hang the thread, in milliseconds 
    */ 
    public void hang(int millis) { 
     started = System.currentTimeMillis(); 
     log.debug("Hanging this thread for " + millis + " ms"); 
     while (hung() < millis) { 
      try { 
       Thread.sleep(beat); 
      } catch (InterruptedException e) { 
       log.debug("Still hanging, will release in " + (millis - hung()) + " ms."); 
      } 
     } 

     log.debug("Releasing thread again after " + hung() + " ms"); 
    } 

    private int hung() { 
     return (int)(System.currentTimeMillis() - started); 
    } 
} 
関連する問題