2017-02-03 34 views
1

情況就是這樣,methodB()在應用程序運行時被再次調用。當調用methodC()時,methodB()將暫停,直到methodC()完成。當調用methodA()時,它會暫停,直到methodB()完成三次,但跳過「代碼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) {} 
     } 
    } 
} 
+0

這可能有所幫助:http://stackoverflow.com/questions/16758346/how-pause-and-then-resume-a-thread – Ishnark

+0

這種類型的邏輯聽起來很奇怪,尤其是「當調用methodA()時,它會暫停,直到methodB()完成三次「如果另一個線程在調用A時已經調用了B怎麼辦?對我進行編碼不會有什麼問題,但我有一種感覺,你正在走錯路。你是什​​麼意思的應用程序?如果調用線程是UI線程,則不能只是阻止並等待收到通知,因爲這會導致UI凍結。 –

+0

實際上,methodB()方法就像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); 
    } 

這應該這樣做。