2012-03-14 19 views
6

メインスレッドを停止せずにアンドロイドアプリケーションで実行中のワーカースレッドをすべて停止する方法はありますか?アンドロイドアプリケーションですべてのワーカースレッドを停止する方法

これはどのような例ですか?

+0

メインスレッドを停止するとどういう意味ですか?ワーカースレッドではどういう意味ですか? – Blackbelt

+0

関連するものを検索しようとしましたか? StackOverflowには素晴らしい検索ツールがあります。あなたの質問は理解しにくいです、説明してください。 –

答えて

1

に応答しない場合、スレッドを停止する方法を提供いけません。

だけinterruptスレッドをすることができますが、スレッドはsleepwait、などのように、中断することができる状態でなければなりません...

か、スレッドスロー例外を作るためにいくつかのトリックを使用することができます

1.スレッドがネットワークに接続している場合、スレッドを停止したい場合は、ネットワーク接続を閉じることができます。ioexceptionをスローします。

2.スレッドがファイルを読み込んだ場合、ストリームを閉じてioexceptionをスローすることができます。スレッド3.Ifは

は、データベースを照会で、あなたはそれがあなたのスレッドの作業に依存するデータベース

を閉じることができます。

1

実際にはスレッドにはメソッドstop()があります。したがって、すべてのワーカースレッドを調べて、このメソッドをそれぞれ呼び出すことができます。

質問は「ワーカースレッドのリストを取得する場所」です。 このリストをアプリケーションレベルのどこかに、つまりワーカースレッドを作成するたびに特別なリストに格納することができます。これは、スレッドが "ワーカー"スレッドであることをあなただけが知っているので、より良い解決策です。

しかし理論的には、アプリケーションを動的に検出してスレッドを取得することもできます。提供された配列を塗りつぶす静的メソッドThread.enumerate(Thread[] threads)があります。しかし、現在実行されているスレッドの数を知る方法は? Thread.activeCount()を使用してください。

Thread[] threads = new Thread[Thread.activeCount()]; 
Thread.enumerate(threads); 
for (Thread t : threads) { 
    if (isWorkerThread(t)) { 
     t.stop(); 
    } 
} 

ワーカースレッドを識別する必要があります。たとえば、スレッドの名前やスレッドのスタックトレースを使用することができます。

しかし、廃止予定のメソッドstop()を呼び出すのは犯罪です。理由については、このメソッドのjavadocを参照してください。

"正しい"方法は、アプリケーション層で正常なシャットダウンメカニズムを実装することです。各スレッドは、スレッドがシャットダウンするかどうかを示すフラグをチェックして、フラグがtrueの場合は、run()メソッドから戻るだけです。この場合、作業スレッドを閉じるのは非常に簡単です。このフラグの値をtrueに設定するだけで、スレッドは終了します。これが「正しい」解決策です。

関連する問題