2017-02-03 1 views
1

La situation est comme ceci, methodB() est appelée encore et encore lorsque l'application est en cours d'exécution. Quand methodC() est appelée, methodB() s'arrêtera jusqu'à ce que methodC() soit terminé. Lorsque methodA() est appelée, elle s'arrêtera jusqu'à ce que methodB() soit fait trois fois mais saute "Code X".Comment gérer deux pause de thread dans une méthode

J'ai essayé d'ajouter locker2, lock2 et threadLocker2() pour faire la pause de methodA(), mais cela n'a pas fonctionné car methodB() a également mis en pause. Quelqu'un peut-il me donner quelques suggestions comment puis-je faire cela?

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

Cela pourrait aider: http://stackoverflow.com/questions/16758346/how-pause-and-then-resume-a-thread – Ishnark

+0

Ce type de logique semble très étrange, en particulier "Quand methodA() est appelée, il s'arrêtera jusqu'à ce que methodB() soit fait trois fois "et si un autre thread appelle déjà B quand A est invoqué? Ce ne serait pas un problème pour moi de coder ceci, mais j'ai le sentiment que vous allez dans le mauvais sens. Que voulez-vous dire par application? Si le thread appelant est le thread de l'interface utilisateur, vous ne pouvez pas simplement bloquer et attendre d'être averti, car cela provoque le blocage de l'interface utilisateur. –

+0

En fait, methodB() est une méthode comme onCameraFrame qui ne sera pas appelée par d'autres threads. – shisushi

Répondre

0

Je voudrais utiliser un booléen atomique (ou un entier) ou un booléen volatile pour cela.

Ceci est le booléen atomique/volatile partagée:

private AtomicBoolean secondMethodIsDone = new AtomicBoolean(false); 

void firstMethod() { 
    methodInOtherThread(); 
    while(!secondMethodIsDone.get()) { 
     //thread sleep waiting... 
    } 
    // do your things when second is done  
} 

Cela se produit dans un autre thread:

void methodInOtherThread() { 
     // do your stuff 
     // whenever is done: 
     secondMethodIsDone.set(true); 
    } 

Cela devrait le faire.