1 van 1

Java communicatie tussen twee threads.

Geplaatst: zo 05 mei 2013, 17:27
door Bert F
Ik heb volgende java probleem:

een eerste class waarin ik een aantal initialisatie doe waarna ik terecht kom in een oneindige while loop.

in mijn eerste initialisatie roep ik volgende code op:

Code: Selecteer alles


Runnable t1=(new Runnable() {

            public void run() {

              jframe_menu.createAndShowGUI();

            }; 

        });

     t1.run(); 

nadien in mijn while loop had ik graag gewacht op nieuwe input uit t1 alleen lukt het me langs geen kanten te wachten tot dat er in t1 iets veranderd en dan weer door te gaan.

Hoe doe ik dat?

Groeten.

Re: Java communicatie tussen twee threads.

Geplaatst: zo 05 mei 2013, 17:38
door Xenion
Kan je de wachtende thread niet op pauze zetten voor onbepaalde tijd via een sleep methode ofzo? Als de t1 dan input heeft voor die thread, dan kan hij die ergens in een lijst ofzo wegschrijven en de thread wakker maken. Wanneer de input verwerkt is, kan de thread weer gaan slapen. Dat is zou efficiënter moeten zijn dan een oneindige loop waarbij je steeds gewoon kijkt of je nieuwe input hebt gekregen.

Re: Java communicatie tussen twee threads.

Geplaatst: zo 05 mei 2013, 18:32
door Bert F
het zit zo ik heb de code in de main:

Code: Selecteer alles


initialisatie;

en dan 

while(true)

do some work;

wacht op t1;

end

het wachten op t1 krijg ik niet geïmplementeerd.

Re: Java communicatie tussen twee threads.

Geplaatst: zo 05 mei 2013, 20:07
door Xenion
Als je t1.join() aanroept dan zeg je dat er gewacht moet worden tot de Thread t1 eindigt.

Als t1 niet eindigt, maar gewoon periodisch resultaten aan t2 wil geven ofzo dan zijn er verschillende opties.

Je kan een mutex object aanmaken dat door t1 gelocked wordt. Je kan dan in t2 proberen van dat object ook te locken en dan zal Java t2 automatisch laten wachten tot dat lock vrijgegeven wordt. Als t1 klaar is met zijn werk, dan kan hij het lock opgeven en dan zal automatisch t2 geactiveerd worden.

Wat ook kan werken is dat je in t2 een constructie als volgt zet:

Code: Selecteer alles


try {

  while(true)

t2.sleep(4000);

} catch (InterruptedException e) {

  // ga verder

}

Als t1 dan klaar is kan t2.interrupt() aangeroepen worden.

Anders kan je ook hier of hier misschien inspiratie opdoen.