如何处理方法中的两个线程暂停
How to handle two thread pause in a method
情况是这样的,当app在运行时,methodB()被一次又一次的调用。当调用 methodC() 时,methodB() 将暂停,直到 methodC() 完成。调用 methodA() 时,它会暂停,直到 methodB() 完成三次但跳过 "Code X".
我尝试添加 locker2、lock2 和 threadLocker2() 来暂停 methodA(),但它不起作用,因为 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);
}
这应该可以做到。
情况是这样的,当app在运行时,methodB()被一次又一次的调用。当调用 methodC() 时,methodB() 将暂停,直到 methodC() 完成。调用 methodA() 时,它会暂停,直到 methodB() 完成三次但跳过 "Code X".
我尝试添加 locker2、lock2 和 threadLocker2() 来暂停 methodA(),但它不起作用,因为 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);
}
这应该可以做到。