このような状況では、アプリの実行中にmethodB()が何度も呼び出されます。methodC()が呼び出されると、methodC()が完了するまでmethodB()は一時停止します。methodA()が呼び出されると、methodB()が3回完了するまで一時停止しますが、「コードX」はスキップします。
methodA()の一時停止を行うためにlocker2、lock2、およびthreadLocker2()を追加しようとしましたが、methodB()も一時停止するため機能しませんでした。誰かが私にこれを行う方法についていくつかの提案をすることができますか?
private final Object locker = new Object();
private boolean lock = false;
public void methodA() {
//Lock until methodB() run three times
//Do something
}
public void methodB() { //A thread called again and again
//Do something
threadLock();
//Code X
}
public void methodC() {
lock true;
//Do something
lock = false;
synchronized (locker) { locker.notify(); }
}
private void threadLock() {
synchronized (locker) {
while (lock) {
try {
locker.wait();
} catch (InterruptedException e) {}
}
}
}
そのために、アトミックブール(または整数)または揮発性ブールを使用します。
これは、共有のアトミック/揮発性ブール値です。
private AtomicBoolean secondMethodIsDone = new AtomicBoolean(false);
void firstMethod() {
methodInOtherThread();
while(!secondMethodIsDone.get()) {
//thread sleep waiting...
}
// do your things when second is done
}
これは別のスレッドで発生します:
void methodInOtherThread() {
// do your stuff
// whenever is done:
secondMethodIsDone.set(true);
}
これでうまくいくはずです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加