2011-09-03 13 views
2
内のスレッド

を停止:は、その実行方法は、このようなものになります...私はサービスで実行中のスレッドを持っているAndroidのサービス

class Consumer implements Runnable { 
    public void run() { 
     while(!finished){ 
      foo(); 
     } 
     cleanUp(); 
    } 

    ... 
} 

を、私はサービスのonStartCommand方法でスレッドを開始していますし、サービスが停止したら、私はそれをシャットダウンしたい。今度はスレッドを停止するために、私はtrue(サービスのonDestroyメソッド)にfinished変数を設定しています。

public void onDestroy() { 
     ... 
     finished = true; 
     ... 
    } 

(私はプログラムをデバッグしていたときに、それだけで正常に動作していることが判明 - >期待通りcleanUpが呼び出されます)

それをデバッグすることなく、cleanUpは呼び出されません。誰も私にこれを説明することはできますか?私の誤りはどこですか?ありがとう

+1

完成した変数への非同期マルチスレッドアクセスは、おそらく問題の大きな部分です。 –

答えて

0

デバッガがあなたのために物事をシリアル化し、それが動作するので、間違いなくスレッドの同期の問題。

あなたの問題を解決するためにシグナリングを使用することをお勧めします。

一方向はisFinished = TRUEに設定した後です。 wait(int timeout)を行い、notify();を実行する実行ループ(consumerクラス)を持っています。このようにConsumerクラスでも状態が悪いので、あなたはまだタイムアウト後に出ます。

+1

ダーン、エラーが見つかりました。メソッド 'foo'では、私は実際にブロッキングキューにアクセスしていました。キューは空だったので、スレッドはqueue.take()で待機していました。したがって、while条件は評価されませんでした。 'onDestroy'のスレッドを中断して修正しました。あなたのヒントのおかげで;) – kmera

関連する問題