Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Thread und interrupt vs. InterruptedExc in sleep

Empfohlene Antworten

Veröffentlicht

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?

  • Autor


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...

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:

[...] 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.
  • Autor
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() {

    }


}

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.