Avatar billede bvirk Professor
01. marts 2019 - 23:05 Der er 3 kommentarer og
1 løsning

Hvordan kan monitor.wait sætte thread på vent

I en klasse (jedit plugin)

public class TxtConvPlugin extends EditPlugin implements EBComponent,Runnable {
...

public TxtConvPlugin(...) {
    thread=new Thread(this);
    thread.start();
    ...
}


public void startConvertFile() {
    onWait=false;
    synchronized(monitor) {
        monitor.notify();
    }
}


private boolean onWait=true;
private Thread thread;
final Object monitor = new Object();
public void run() {
    try {
        for(;;) {
            while(onWait)
                synchronized(monitor) {
                    monitor.wait();
                }
            convertFile();
            onWait=true;
        }
    } catch (InterruptedException e) {}
}


Muliggør afvikling af convertFile() i en ny thread. Det virker, men jeg forstår det ikke.
Jeg ved godt hvordan synchronized(object) bevirker at kun en thread of execution ad gangen kan befinde sig i det omklamrede.
Men hvordan kan wait på et object, hvis eneste relation til klassen hvori run ligger, er at det er data member, afstedkomme at thread kommer på vent?
Avatar billede arne_v Ekspert
02. marts 2019 - 00:54 #1
Det er helt ligegyldigt hvilket objekt det er og hvilken relation objektet har til andre klasser.

foobar.wait();

venter indtil nogen kalder:

foobar.notify();

eller:

foobar.notifyAll();

Det skal bare vaere samme objekt for wait og notify*.
Avatar billede arne_v Ekspert
02. marts 2019 - 00:57 #2
En anden maade at se paa det er er at sammenligne.

Java:

foobar.wait();
foobar.notify();
foobar.notifyAll();

laves i .NET som:

Monitor.Wait(foobar);
Monitor.Pulse(foobar);
Monitor.PulseAll(foobar);

Og maaske synes du at .NET maaden er mere "naturlig".
Avatar billede bvirk Professor
03. marts 2019 - 13:34 #3
Tak for svar.
Threads er en ny ting for mig - havde første troet at thread objectets wait() method var det som kunne sætte en thread på vent.
Jeg erfarede så at det ikke var muligt at vække en thread igen, hvis den var stoppet på thread objektets wait().

Grundet dette, som, ser jeg nu, gælder for ethvert object
"Causes the current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object"
fra  .../api/java/lang/Object.html#wait--

Kan jeg se at <object>.wait() beliggende i den kode der afvikles af thread løser opgaven incl. synkronisering.
Der er mange at arbejde på threads på - jeg har fundet en udmærket artikelserie på www.javaworld.com
Avatar billede arne_v Ekspert
03. marts 2019 - 14:18 #4
wait/notify* er en meget low level konstruktion.

Hvis muligt vil jeg klart anbefale at bruge nogle af mulighederne i java.util.concurrent,
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester





CIO
Årets CIO 2022: Nu skal Danmarks dygtigste CIO findes - er det dig? Eller kender du en, du vil indstille?