Avatar billede jespersahner Nybegynder
21. september 2005 - 15:32 Der er 23 kommentarer og
2 løsninger

Thread, erstatte suspend, resume og stop

Jeg har en kode-stump, hvor jeg i en thread gerne vil erstatte suspend(), resume() og stop():

Thread th;
...
if (...) th.suspend();
if (...) th.stop;
else th.resume();

Hvordan gør jeg det nemmest?
Avatar billede mikkelbm Nybegynder
21. september 2005 - 15:44 #1
Avatar billede jespersahner Nybegynder
21. september 2005 - 15:55 #2
->mikkelbm: Som jeg læser det, er man så nødt til i run()-metoden løbende at spørge til, om tråden skal afbrydes.

Men hvad gør man så, hvis man f.eks. anvender dynamisk class-loading, hvor man ønsker at afbryde f.eks. Class.forName("MinKlasse").newInstance()? I mit tilfælde foretager "MinKlasse" læsning og skrivning til eksterne filer, og det er denne del, jeg gerne vil afbryde.
Avatar billede arne_v Ekspert
21. september 2005 - 16:13 #3
du kalder en metode via reflection som sætter et "stop ved første passende
lejlighed" flag
Avatar billede jespersahner Nybegynder
21. september 2005 - 16:24 #4
->arne_v: Jeg er ikke helt med, inde i maven på "MinKlasse"?
Avatar billede arne_v Ekspert
21. september 2005 - 16:31 #5
man lader sin klasse have:

private boolean cont;
public void setCont(boolean cont) {
    this.cont = cont;
}
public void run() {
    ...
    while(cont) {
        ...
    }
    ...
}

eller har jeg misforstået hvad du vil ?
Avatar billede mr_chaos Praktikant
21. september 2005 - 16:55 #6
Man kunne gøre det noget ala følgende.

public class MinThread extends Thread {

    boolean stopped = false;
    boolean suspended = false;
   
    public void run() {
        while(!stopped) {
            if(suspended) {
                synchronized(this) {
                    try {
                        this.wait();
                    }
                    catch (InterruptedException e) {
                        //Handle
                    }                   
                }
            }
            //Do something
        }
    }
   
    public void doSuspend() {
        suspended = true;
    }
   
    public void doResume() {
        suspended = false;
        synchronized(this) {
            this.notifyAll();
        }
    }
   
    public void doStop() {
        stopped = true;
    }   
}
Avatar billede jespersahner Nybegynder
22. september 2005 - 18:19 #7
->arne_v: Class.forName() kaldes pt. i en tråd, som jeg ønsker at afbryde, f.eks.:

public class ThreadKlasse implements Runnable;
    public void run() {
        Class.forName("MinKlasse").newInstance();
    }
}


I en anden klasse har jeg derfor pt.:

ThreadKlasse k;
Thread th;
th.start(k);
if (...) th.suspend;
if (...) th.stop;
else th.resume;

Som jeg forstår dig, skal jeg i klassen Minklasse - altså den klasse der load'es dynamisk - inkludere:

private boolean cont;
public void setCont(boolean cont) {
    this.cont = cont;
}
public void run() {
    ...
    while(cont) {
        ...
    }
    ...
}

- og jeg kan så kalde setCount() vha. reflection, når der skal stoppes.

Jeg spørger så måske lidt dumt her: Er det nødvendigt, at MinKlasse
kører i sin egen tråd (du definerer jo run()), eller er det nok med tråden th?
Avatar billede jespersahner Nybegynder
22. september 2005 - 18:30 #8
->arne_v: - altså kunne jeg lige så godt bruge en anden metode end run():

private boolean cont;
public void setCont(boolean cont) {
    this.cont = cont;
}
public void minmetode() {
    ...
    while(cont) {
        ...
    }
    ...
}

Jeg tror, at jeg tænker lidt på, om man har adgang til MinKlasse/minmetode(), når MinKlasse ikke selv implementerer Runnable men kaldes fra en klasse, der gør det. Er det rent volapyk?
Avatar billede mikkelbm Nybegynder
22. september 2005 - 21:33 #9
Hvis du vil ha' det til at køre i en tråd, skal du have en run metode.
Avatar billede mikkelbm Nybegynder
22. september 2005 - 21:37 #10
public class ThreadKlasse implements Runnable;
    public void run() {
        Class.forName("MinKlasse").newInstance();
    }
}


Denne tråd stopper af sig selv, når forName kaldet er afsluttet. Jeg er ikke helt med på, hvad det er du vil?
Avatar billede arne_v Ekspert
22. september 2005 - 22:14 #11
run var kun fordi jeg troede at den klasse var tråden
Avatar billede jespersahner Nybegynder
23. september 2005 - 00:46 #12
->arne_v: For så vidt Class.forName("MinKlasse") afvikles i tråden ThreadKlasse, er det så nødvendigt at lave en tråd i MinKlasse?

Eller anderledes udtrykt: Har jeg så at sige adgang til (mulighed for at stoppe) MinKlasse, selv om den ikke selv er en tråd, blot den afvikles i en anden klasse ThreadKlasse, som er en tråd?
Avatar billede jespersahner Nybegynder
23. september 2005 - 00:53 #13
->mikkelbm: Mit ønske er at stoppe eksekveringen af Class.forName("MinKlasse").newInstance(). Som Arne forklarer - hvis jeg forstår det rigtigt - er det muligt ved at bygge metoden setCont() ind i MinKlasse, idet denne metode sætter et flag, som den anden metode run() (eller: minmetode()) spørger på.

Da videre MinKlasse load'es dynamisk på runtime, kan setCont() ikke tilgås direkte men via reflection (Method, invoke etc.)
Avatar billede mikkelbm Nybegynder
23. september 2005 - 00:56 #14
Hvad laver din "MinKlasse" ?
Hvis den kører som en tråd, så skal du gøre som Arne skriver. Ellers burde du bare kunne nulstille referencen og så vil den blive garbagecollected.
Avatar billede jespersahner Nybegynder
23. september 2005 - 01:04 #15
->mikkelbm: MinKlasse skriver f.eks. en masse data til en fil, og jeg kan have brug for at afbryde denne undervejs. MinKlasse kører ikke umiddelbart som en tråd, men den afvikles i en klasse, som er en tråd, nemlig ThreadKlasse. Nulstilling af referencen kan derfor først ske, når jeg har afbrudt eksekveringen, hvortil jeg har brug for Arnes kodestump. Hvad jeg imidlertid ikke kan overskue er, om MinKlasse selv skal køre som en tråd (inde i tråden ThreadKlasse), eller om det er nok, at ThreadKlasse er en tråd, jf. mit spm. til Arne ovenfor.
Avatar billede mikkelbm Nybegynder
23. september 2005 - 01:11 #16
Hvordan får den klasse fat i det data?

Det jeg tænker på, er om den hele tiden forespørger noget, eller om du leverer data til den?
Avatar billede jespersahner Nybegynder
23. september 2005 - 01:15 #17
->mikkelbm: Det er vel ikke som sådan afgørende, hvad MinKlasse laver. Pointen er blot, at den skal kunne afbrydes, i det den laver. I princippet kunne den blot indeholde en "dum" løkke, som skrev en masse tilfældig genereret tekst ud i en tekstfil.
Avatar billede mikkelbm Nybegynder
23. september 2005 - 01:24 #18
Jeg vil da lige præcis mene at det er relevant hvad den laver. For hvis den kører i en løkke, så skal den afbrydes med en boolean som arne foreslår.

Hvis ikke den kører i en løkke er der vel ikke noget at afbryde? Medmindre den har metoder du fodrer med data. Og hvis det er tilfældet så er der jo ikke noget at stoppe i "MinKlasse".
Avatar billede mikkelbm Nybegynder
23. september 2005 - 01:25 #19
De sidst to linjer blev lidt kryptiske :)

Det jeg mener er, at hvis du smider data ned til "MinKlasse", så skal afbrydelsen af den datastrøm stoppes et andet sted.

Men jeg tvivler på, at det er dit scenarie, da du loader den dynamisk.
Avatar billede jespersahner Nybegynder
23. september 2005 - 01:30 #20
->mikkelbm: Ja, hvis MinKlasse både læser og skriver data (det vil den typisk gøre), skal begge dele stoppes, og det sker ved at bryde ud af en løkke, når et flag sættes.
Avatar billede mikkelbm Nybegynder
23. september 2005 - 01:32 #21
Præcis.
Avatar billede mr_chaos Praktikant
23. september 2005 - 07:55 #22
Man kan vel sige at den dynamiske læse/skrive klasse skal implementere et bestemt interface, som så har en close metode, som så skal lukke diverse input/output stream osv.
Så når tråd klassen stopper, så kalder den close på den klasse den bruger.
Avatar billede jespersahner Nybegynder
17. oktober 2005 - 12:25 #23
Smid gerne et svar, en af jer.
Avatar billede arne_v Ekspert
17. oktober 2005 - 12:37 #24
vi kan vel dele
Avatar billede mikkelbm Nybegynder
17. oktober 2005 - 14:10 #25
.
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
Kategori
Kurser inden for grundlæggende programmering

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