Service.java内のTimeThread.javaの開始 Service.javaが重複して実行されると問題が発生します。複製サービスと同期
なぜ 'isWait'値が 'Log.d( "isRun1")'で 'true'で、 'Log.d( "isRun2")'でfalseですか?
「サービスの重複実行」と「同期」については不思議です。
私のコードは次のとおりです。
Service.java
thread.pauseNrestart(false);
Thread.java
public class TimeThread extends Thread {
Handler handler;
boolean isRun = true;
boolean isWait = false;
public TimeThread(Handler handler) {
this.handler = handler;
}
public void pauseNResume(boolean isWait) {
synchronized (this) {
this.isWait = isWait;
*Log.d("isRun1 :" + isRun + "");*
notify();
}
}
public void run() {
while (isRun) {
*Log.d("isRun2 :" + isRun + "");*
try {
Thread.sleep(1000);
} catch (Exception e) {
// TODO: handle exception
}
if (isWait) {
try {
synchronized (this) {
wait();
}
} catch (Exception e) {
// TODO: handle exception
}
}
handler.sendEmptyMessage(0);
}
}
}
最適化が行われたときに、コードの
「サービスの重複実行」という質問のセクションで尋ねられていることがあまりにもわかりません...私はそれがAndroidと関係するかもしれないと思います - 私のAndroidに関する知識は限られています。上記の答えは、Javaの並行性に関連しています。 – Smiley
私はそれについてもっと考えることができます。あなたの答えをありがとう。 – mmoa
@mmoaあなたの質問が再読されました。 「サービスの重複した実行」が複数のスレッドが実行されていることを意味しているだけです(あなたは「Service.java内でTimeThread.javaを開始しました」)。 1つのスレッドだけでは問題は発生しませんが、2つのスレッドが他のスレッドに影響するものを変更したり、並行性の可視性の問題のために他のスレッドが表示しない変更を加えることがあります。ビジー・ループの代わりに[実行条件](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Condition.html)が役立ち、実行/待機を確認することも可能です – Smiley