Zum Inhalt springen

Thread und interrupt vs. InterruptedExc in sleep


Empfohlene Beiträge

Geschrieben

Hi, (using: Java6)

anscheinend habe ich Threads immernoch nicht richtig verstanden.

Folgendes:

Ich habe einen Thread, der kontinuirlich auf die Festplatte zugreit (alle 5min) und dazwischen mit sleep schläft. Nun kann der User das Zugriffsintervall herabsetzen auf 5sek, was ein this.interrupt() auslöst [was ja eigentlich den schlafenden Thread aufwecken sollte] und der neue Wartewert wird entsprechend gesetzt. Nun passiert aber das aufwecken gar nicht; bei Aufruf von interrupt(); passiert gar nichts, der Thread schläft einfach weiter.

Woran liegt das?

Muss ich in dem Zusammenhang doch einen Semaphor bzw wait/notify bzw synchronized etc. verwenden? Allerdings ist dies doch nicht nötig, oder doch?

Geschrieben


public class FreeDiskSpace extends Thread implements ActionListener,

        ItemListener {


...


public static void main(String... args) throws Exception {

    Thread a = new FreeDiskSpace();

    a.run();

}


// aufgerufen, wenn user in der GUI ein anderes zeitintervall angibt

// wenn der user das intervall von zuvor 5min auf 5sek heruntersetzt, soll

// der sleep natürlich unterbrochen werden und neue arbeit tun, dann 5sek

// warten usw.

public void itemStateChanged(ItemEvent e) {

    this.interrupt(); // KEINE WIRKUNG; evtl. weil im event-disp. thread??

    // jetzt wird neuer wert gesetzt

    fdsProperties.setProperty("time", "5"); //5sek, (s.u.: 5 *1000)

}


@Override

public void run() {

    while (true) {

        // do some work

        try {

            final long k = Long.valueOf(fdsProperties.getProperty("time")).longValue() * 1000;

            logger.info("sleeping " + k + "ms...");

            Thread.sleep(k);

            logger.info("woken up");

        } catch (InterruptedException e) {

            logger.info("interrupted"); // PASSIERT NIE

        }

    }

}

Jetzt habe ich gerade etwas von SwingWorker und Timer nachgelesen (Threads and Swing)

Hmm...

Geschrieben

Hat das einen Grund, dass du von Thread vererbst ?

Ich würde hier eher einfach Runable implementieren.

bsp:

public class TestThread1 implements Runnable{


  Thread thread = null;


  public synchronized void start(){

    if (thread == null){

      thread = new Thread(this);

      thread.start();

    }

  }


  public synchronized void stop(){

      thread.stop();

  }


  public void run(){

    ...

  }


}

Von Thread ableiten ist eklig und böse, glaub mir. :floet:

Geschrieben
[...] Code [...]
Ich sprach von Testcase - nicht von Codeausschnitt. Sprich: Ein lauffähiges Programm, das genau das von dir beschriebene Verhalten demonstriert. Um dir zu helfen würde ich gerne Code nehmen, in Eclipse kopieren, laufen lassen, sehen "aha funktioniert nicht" und evtl. checken warum. Aber wenn die "Quelldaten" fehlen wird das auch mit der Hilfe nix.
Geschrieben
import java.awt.AWTException;

import java.awt.CheckboxMenuItem;

import java.awt.PopupMenu;

import java.awt.SystemTray;

import java.awt.TrayIcon;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.image.BufferedImage;


public class Main extends Thread implements ActionListener{


    /** time to wait */

    long time = 300;


    public static void main(String[] args) {

        Thread t = new Main();

        t.start();

    }


    public Main(){

        // Konstruiere Tray-Icon ...

        TrayIcon trayIcon = new TrayIcon(new BufferedImage(16, 16,

                BufferedImage.TYPE_4BYTE_ABGR));


        // Popup-Menü erstellen, sodass user interval festlegen kann

        PopupMenu contextMenu = new PopupMenu();


        CheckboxMenuItem item5min = new CheckboxMenuItem("5min", true);

        item5min.setName("300");

        item5min.addActionListener(this);

        contextMenu.add(item5min);


        CheckboxMenuItem item5sec = new CheckboxMenuItem("5sec", false);

        item5min.setName("5");

        item5min.addActionListener(this);

        contextMenu.add(item5sec);


        trayIcon.setPopupMenu(contextMenu);


        // Zum System-Tray hinzuf�gen ...

        SystemTray tray = SystemTray.getSystemTray();

        try {

            tray.add(trayIcon);

        } catch (AWTException e) {  }


    }


    @Override

    public void run(){

        while (true) {

            nop(); // entsprechende aktionen hier 


            final long t = time * 1000;


            try {

                System.out.println("sleeping " + t + "ms");

                Thread.sleep(t);

                System.out.println("waken up");

            } catch (InterruptedException ex) {

                System.out.println("interrupted");

            }

        }

    }


    public void actionPerformed(ActionEvent e) {

        CheckboxMenuItem c = (CheckboxMenuItem) e.getSource();

        time = Long.valueOf(c.getName());

        interrupt();

    }


    private void nop() {

    }


}

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...