2017-02-03 9 views
1

Ситуация подобна этому, метод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) {} 
     } 
    } 
} 
+0

Это может помочь: http://stackoverflow.com/questions/16758346/how-pause-and-then-resume-a-thread – Ishnark

+0

Этот тип логики звучит очень странно, особенно «Когда вызывается методA() он будет приостановлен до тех пор, пока methodB() не будет выполняться три раза », что, если другой поток уже вызывает B при вызове A? Для меня не было бы проблем кодировать это, но у меня такое чувство, что вы идете по неправильному пути. Что вы подразумеваете под приложением? Если вызывающий поток является потоком пользовательского интерфейса, вы не можете просто блокировать и ждать уведомления, потому что это заставляет замолчать пользовательский интерфейс. –

+0

Собственно, методB() - это метод, подобный onCameraFrame, который не будет вызываться другими потоками. – shisushi

ответ

0

Я хотел бы использовать атомное логическое значение (или целое число) или летучее логическое значение для этого.

Это общая атомная/летучий булево:

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); 
    } 

Это должно сделать это.

 Смежные вопросы

  • Нет связанных вопросов^_^