Avatar billede habba Nybegynder
28. maj 2001 - 09:57 Der er 7 kommentarer og
1 løsning

Stop en sleep() fra en anden tråd.

Jeg har en tråd der skal sleep f.eks. 60 sec. men ved en event fra en anden tråd skal vågne hvordan gøres dette:)
Avatar billede agermose Nybegynder
28. maj 2001 - 10:05 #1
din tråd skal fange interrupt execpetions og den anden tråd skal kalde interrupt på den første tråd.

try {
  sleep(1000);
} catch (InterrupException) {
}

fra den anden:

traad.interrupt();

jeg er faktisk ikke lige sikker på om det er nødvendigt at fange den execption....

se:

http://java.sun.com/docs/books/tutorial/essential/threads/
Avatar billede habba Nybegynder
28. maj 2001 - 16:51 #2
Hello!
Hvis man interruper en tråd der er gået i sleep kan man så ikke starte den igen. Jeg har prøvet med resume og start(); men det virker som om tråden er killed.
Avatar billede agermose Nybegynder
28. maj 2001 - 17:02 #3
stop, suspend og resume er depricated, og bør derfor ikke bruges. Jeg mener derfor ikke der længere er nogen mulighed for at understøtte egentlig resume/suspend længere uden at man selv skriver sine run metoder til at understøtte dette. Det kræver at du fanger disse InterrupExceptions og håndtere dem rigtigt.

Den tråd du har i \"sleep-mode\" og interrupter, catch\'er den den exception, eller dør den?
Avatar billede habba Nybegynder
28. maj 2001 - 19:25 #4
Den catch\'er men opfører sig som død da jeg ikke kan starte den igen!
Avatar billede lbhansen Nybegynder
28. maj 2001 - 21:59 #5
Du skal fange den InterruptedException, og ikke betragte den som en fejl, men bare et signal om at den skal lave noget istedet for at afslutte
Avatar billede delbing Nybegynder
28. maj 2001 - 22:08 #6
Når du til slutningen af run() metoden?
Du skal sørge for at den \"genstarter\" selv fx ved en while(true)-løkke:

public void run() {
while (true) {
  // gør hvad den skal
  try {
  sleep(60*1000);
  } catch (InterruptedException ie) {
}
}

Hvis den ikke skal \"genstarte\" uden et interrupt kan du have try-sleep inde i en ny while(true)-løkke, som du forlader vha. catch( InterruptedException e) { break;}
Avatar billede logical Nybegynder
29. maj 2001 - 16:48 #7
Er det du vil lave det her?

En tråd skal vente i (minimum) 60 sekunder, og derefter gøre noget. Hvis man interagerer lidt tidligere skal den også gøre det, og derefter stoppe. Så kan man evt. starte den igen, hvis behovet skulle opstå.

Hvis ja, så kan løsningen være som følger:

public class SleepAndRun implements Runnable {
  private Thread worker = null;
  private int delay;

  public SleepAndRun(int delay) {
    this.delay = delay;
  }
  public int getDelay() { return delay; }
  public void setDelay(int d) { delay = d; }

  public void start() {
    if (!isRunning()) {
      worker = new Thread(this);
      worker.setName(\"SleepAndRun\");
      worker.start();
    }
  }
  public boolean isRunning() {
    return worker != null;
  }

  public void preempt() {
    if (isRunning())
      worker.interrupt();
  }

  public void stop() {
    Thread moribund = worker;
    worker = null;
    if (moribund != null)
      moribund.interrupt();
  }
  public void run() {
    int myDelay = delay;
    if (isRunning()) {
      try {
        Thread.sleep(myDelay);
      } catch (InterruptedException e) {}
    }
    if (isRunning()) {
      performTediousTask(); // Do it here.
    }
  }
}

Denne stump kode sikrer, at der kun kører en tråd, at tråden kan preemptes, dvs. bremses af sin sleep, kan startes igen, kan stoppes uden at tediousTask bliver udført (Hvis den kan nå det).

Hvis det ikke er det, du er ude efter, men f.eks. en gentagen hændelse hvert minut, evt. fremprovokeret, så sig til.
Avatar billede thomaz Nybegynder
30. maj 2001 - 21:51 #8
lige en kommentar Det nemmeste vil helt sikkert at bruge Javax s indbyggede klasse Timer. Man kan bruge stop() og start() på denne klasse.
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