J'ai une méthode et un thread que je voudrais exécuter dans l'ordre suivant: D'abord la méthode devrait faire quelque chose avec un objet, et ensuite le thread devrait faire quelque chose avec l'objet. Ils partagent le même objet. Je dois les synchroniser, mais je ne fais que rencontrer Threads. Comment puis je faire ça?Synchronisez le thread et une méthode avec un objet?
private synchronized method()
{
//do something with an object (a field)
}
Runnable ObjectUpdater = new Runnable()
{
//do something with the object after the method has finished
}
Mon code, qui réussit à geler mon thread principal (où la méthode est) Mon code de fil:
private Runnable something = new Runnable(){
synchronized (this){
while (flag == false)
{ try {wait();)
catch (IntExc ie) {e.printStackTrace...}
}
//here it does its thing
}
setFlag(false);
}
My method code (part of the main thread)
private void Method()
{
//do its thing
setFlag(true);
notifyAll();
}
J'ai un thread qui met à jour un composant de l'interface utilisateur. Et j'ai aussi le fil conducteur. Le thread principal initialise les éléments, sur lesquels le composant de l'interface utilisateur s'appuie. Pour être correctement dessinés, les éléments doivent être initialisés avant que le composant UI ne soit tracé. En outre, le thread principal, l'objet et le thread séparé ne sont pas dans la même classe. – George
@George, le thread principal pourrait appeler la méthode pour mettre à jour l'objet avant de le faire connaître au thread de l'interface utilisateur. Si cela est impossible, synchroniser sur l'objet et introduire une méthode comme 'isInitialised()' de sorte que le thread d'interface utilisateur peut vérifier que l'objet est dans l'état correct après aquired la serrure. – rsp
Merci, c'est ce que j'essaie de faire pour la meilleure partie d'une heure.J'ai fait un drapeau, et le thread de mise à jour de l'interface utilisateur attend "le feu vert" par le code suivant while (theNameOfMyFlag() == false) { try {wait} catch .... } // après ce bloc , faites ce qu'il devrait faire et dans mon fil principal - theNameOfMyFlag.set (true); notifyAll(); Log.d .... Le problème est typique - IlligalMonitorStateException, car l'objet n'est pas verrouillé avant "wait()". Si je verrouille l'objet via synchronized (this) ou ReentrantLock, mon application se bloque. Quelque chose ne va pas ... – George