Ситуация подобна этому, методB() вызывается снова и снова, когда приложение запущено. Когда вызывается метод C(), методB() будет приостановлен до тех пор, пока не будет выполнен методC(). Когда вызывается методA(), он будет приостановлен до тех пор, пока methodB() не будет выполняться три раза, но пропустите «Код X».Как обрабатывать две приостановки потока в методе
Я попытался добавить locker2, lock2 и threadLocker2(), чтобы сделать паузу методаA(), но это не сработало как методB() также приостановить. Может ли кто-нибудь дать мне несколько советов, как я могу это сделать?
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) {}
}
}
}
Это может помочь: http://stackoverflow.com/questions/16758346/how-pause-and-then-resume-a-thread – Ishnark
Этот тип логики звучит очень странно, особенно «Когда вызывается методA() он будет приостановлен до тех пор, пока methodB() не будет выполняться три раза », что, если другой поток уже вызывает B при вызове A? Для меня не было бы проблем кодировать это, но у меня такое чувство, что вы идете по неправильному пути. Что вы подразумеваете под приложением? Если вызывающий поток является потоком пользовательского интерфейса, вы не можете просто блокировать и ждать уведомления, потому что это заставляет замолчать пользовательский интерфейс. –
Собственно, методB() - это метод, подобный onCameraFrame, который не будет вызываться другими потоками. – shisushi