2010-12-27 4 views
0

私はメインメソッドがプロセスを呼び出すと言います。現在、このプロセスが滞っているか、時間がかかりすぎると、スレッドを中断することによって、通常、プロセスが中断することがあります。どうすればスレッド自体を呼び出すことができますか?

しかし、メインメソッドでは外部スレッドには実装されていませんが、私はthread.interupt()と呼ばれるようにインターラクションのために現在のスレッド自体をどのように呼び出すことができますか?

+0

わかりません。スレッドが中断しようとしているときにあなたのスレッドは何をしていますか? – EboMike

+0

私はスレッドを持っていません。私はRuntime.execを使用してプロセスからの出力を読んでいますが、時にはこれを行うために立ち往生できます。通常、このプロセスが実行されているスレッドをインターヒューティングすることで、これを永遠に待つことを防ぐことができます。どのような質問は、このプロセスがmainメソッドで実行されていて、外部スレッドの中で実行されていない場合、どのように私はこれを混乱させることができますか? – David

+1

メインスレッドはスレッドでもあるので、他のスレッドと同様に割り込みすることができます( 'Thread.currentThread()'を使ってスレッドオブジェクトへの参照を取得します)。 'Process.waitFor()'で待機しているときに割り込みを得るには、タイムアウト時にメインスレッドの割り込みをトリガできる外部タイマスレッドが必要です。 – rodion

答えて

0

メインメソッドでは、すべてのスレッドへの参照があります。ちょうどあなたが実行しているスレッドがtrueに設定割り込みフラグを得たかどうかをチェックすることを忘れないようにしてください右の参照を取得し、この

someThread.interrupt(); 

ような何かを行います。 は例えば、それの方法の真ん中に、それ自体がisInterruptedを場合は、他のいくつかのスレッド

if(Thread.currentThread().isInterrupted()){ 
doSomeStuff(); 
} 
+0

someThread.interrupt();彼のプログラムの唯一のスレッド、すなわち主な方法であることが起こりますか?彼はどうしてこの "someThread"と呼ぶべきですか?これが彼が求めていることです。 –

+0

まあ、彼はそれが実行を開始するように設定しているので、彼はそれを参照し、彼は割り込みにフラグを設定することができますね。少なくともそれは私が推測したものです。 – pringlesinn

0

あなたは新しいスレッドを作成し、新しいスレッドの中から、あなたのプロセスを呼び出すことができます()でチェックする必要があります。このスレッドを中断し、ロジックごとに例外をキャッチします。

mainメソッド内でのみフォームを作成する方法がわかりませんが、メソッド呼び出しによってメソッドが呼び出された場合は、このメソッドを新しいスレッドから呼び出し、mainメソッドにタイマーを設定してください。タイマーが期限切れになると、そのスレッドを中断して、あなたはうまく行きます。

1

もう一度バックアップしてください。 Thread.interruptは、計算ではなく、待機条件にのみ割り込みします。計算を中断するためのJavaコンストラクト(監視/デバッグエージェントを除く)はありません。

したがって、長時間実行される計算を中断したい場合は、頻繁に割り込みを慎重にチェックするように書く必要があります。

プロセスの外側から「中断」できるようにするには、シグナルを処理する必要があります。それは私が主なスレッドに関するあなたの質問に置くことができた唯一の解釈についてです。

This blog post(私以外ではない)には基本的な情報があります。ハンドラから、たとえばメインスレッドを中断することができます。

+0

Re "計算を中断するためのJava構文はありません"、Thread.stop(new InterruptedException())がありますが、それには多くの問題があります。 –

+0

その問題の1つは、上記の問題のために推奨されていないことです。私はそれをお勧めしません。 – EboMike

1

別のスレッドに「あなた」(メイン)を割り込ませることができます。このように:

final Thread me = Thread.currentThread(); 
Thread wake_me_up = new Thread(){ 
    @Override 
    public void run(){ 
     //InterruptionException try catch omitted. 
     Thread.sleep(200); 
     me.interrupt(); 
    } 
}; 

wake_me_up.start(); 

try{ 
    go_into_cave(); 
}catch(InterruptedException e){ 
    //I got interrupted 
    System.out.println("thank you, you saved my life"); 
} 

go_home(); 

私が読み、それは難しい見つけながら...

+0

'Timer'クラスを使うこともできます:' new Timer()。schedule(interruptTask、200); 'と同じ効果を得るために) – rodion

0

あなたは、なぜあなたもスレッドを心配している、それがハングアップしているため、プロセスを強制終了しようとしている場合は? Runtime.exec()Processオブジェクトを返します。このオブジェクトを使用してサブプロセスを破棄できます。

  • Processオブジェクトを保存して、サブプロセスを生成できます。
  • おそらく、あなたは Process.getInputStream()によって返されるものを介して、プロセスの出力ストリームを読み込んでいます。だから、それを続けてください。
  • ただし、の2番目のスレッド(またはメインスレッドを使用)を生成してプロセスを監視します。 がプロセスの実行時間が長すぎると判断した場合は、Process.destroy()でプロセスを終了させることができます。
  • その時点で、最初のスレッドはプロセスの出力ストリーム 上でEOFまたはIOException(ストリームが閉じられている)を取得する必要があります。
関連する問題