Veröffentlicht 7. Mai 200817 j 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?
7. Mai 200817 j Autor Achso, ich vergaß zu erwähnen, dass der Aufrug von interrupt() innerhalb einer itemStateChanged() - Methode stattfindet, die Klasse also einen ItemListener implementiert.
7. Mai 200817 j 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...
7. Mai 200817 j 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:
7. Mai 200817 j [...] 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.
10. Mai 200817 j 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.