mkScheller Geschrieben 7. Mai 2008 Geschrieben 7. Mai 2008 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? Zitieren
mkScheller Geschrieben 7. Mai 2008 Autor Geschrieben 7. Mai 2008 Achso, ich vergaß zu erwähnen, dass der Aufrug von interrupt() innerhalb einer itemStateChanged() - Methode stattfindet, die Klasse also einen ItemListener implementiert. Zitieren
perdian Geschrieben 7. Mai 2008 Geschrieben 7. Mai 2008 Ich kann deiner Beschreibung nicht ganz folgen - poste dochmal einen Testcase. Zitieren
mkScheller Geschrieben 7. Mai 2008 Autor Geschrieben 7. Mai 2008 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... Zitieren
TDM Geschrieben 7. Mai 2008 Geschrieben 7. Mai 2008 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: Zitieren
perdian Geschrieben 7. Mai 2008 Geschrieben 7. Mai 2008 [...] 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. Zitieren
mkScheller Geschrieben 10. Mai 2008 Autor Geschrieben 10. Mai 2008 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() { } } Zitieren
mkScheller Geschrieben 10. Mai 2008 Autor Geschrieben 10. Mai 2008 hat sich erledigt, war ein logischer/struktureller fehler Zitieren
Empfohlene Beiträge
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.