2012-04-18 4 views
4

私は3つの別々のスレッドで3つのメソッドを呼び出し、その後それらを殺す必要があるアプリケーションがあります。 Javadocによると、私はスレッドstop()とさらにdestroy()が廃止されていることに気付きました。そのように私は他のスレッドの後に1つのスレッドを開始し、同様に次々に1つのスレッドを終了させます。私は廃止されたメソッドを使用することができないので、スレッドを殺す特定の方法はありますか?Javaのスレッドを殺すandroid

ありがとうございました

+1

'Thread.join()'を使ってそれらが完了するのを待つことはできますか? – hmjd

+2

一歩を踏み出すと、本当に自分のスレッドが必要か、[Executor](http://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html)でスレッドプールを使用できますか? )? – weston

+2

... Androidスレッドプールの実行者リファレンス:http://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html – weston

答えて

3

スレッドを強制終了しません。 Thread.interrupt()に電話をかけてから、interruptedのステータスまたは中断されているスレッド内のInterruptedExceptionに反応します。または、volatileフラグを使用します。背景と詳細については、the official documentationを参照してください。

さらに、コメントで示唆しているように、rawスレッドの代わりにスレッドプール/エグゼキュータを使用してください。

+2

westonとJoolanのコメント後、スレッドプールbcauseは、開始スレッドのオーバーヘッドを1つずつ減らします。私はそれについても良い例を見出し、これを見て、それは誰にとっても非常に役に立つでしょう。したがって、その実装の例がここにあります http://apachejava.blogspot.co.uk/2010/03/java-thread-pool-easy-tutorial.html 私はJoolansの回答を受け入れており、Westonsのコメントでさえ助けてくれましたスレッドプールを読み取る – rosesr

0

いつでもどこでも動作する不正なスレッドを終了することはかなり不可能です。

実行中のスレッドのソースコードを制御できる場合は、必要なときにスレッドを停止できる方法を追加する必要があります。基本的には、このメソッドはブール変数を変更し、スレッドはその値を定期的にチェックして継続できるかどうかを確認します。

public class MyTask implements Runnable { 
    // Set this to true when thread must stop. 
    private boolean mStopRequested = false; 
    public void run() { 
     while (mStopRequested == false) { 
      // ... 
     } 
    } 
} 

あなたは、このような方法を提供していないサードパーティのライブラリを呼び出す場合は、運の外にあると醜いクラッジに頼らなければなりません。ライブラリーからアクセスされたファイル(FileNotFoundExceptionをスローして終了したファイル)を削除することで、長時間実行されていたサードパーティライブラリー呼び出しを一旦終了しなければなりませんでした。そしてそれはUnixシステムでのみ機能しました。

あなたの走行距離は異なります。

0

受信者が実行を終了して終了するか、最初に何が起きても指定されたタイムアウトが切れるまで、joinメソッドを使用します。

thread1.join(1); 
thread2.join(2); 
thread3.join(3); 

例外を処理する必要があります。

関連する問題