Beendeten Thread neu starten



  • Ich weiß, dass man einen Thread, dessen run() Methode returned hat, nicht einfach noch mal mit start() neu starten kann -> IllegalThreadStateException.

    Die Alternative ist wohl, das run() als Endlosschleife zu realisieren, und eine boolsche Variable im Thread zu nutzen, um in dieser Schleife die "Rechnung" an oder aus zu schalten.

    Wenn man die Schleife aber einfach als while(true) implementiert, klaut der Tread ständig Rechenzeit, weil er zichtausend Mal pro Sekunde die boolsche Variable prüft. Wenn man aber ein Sleep einbaut, reagiert der Thread nur noch mit Verzögerung auf eine Änderung der boolschen Variable.

    Kann man das geschickter lösen?



  • wait/notify?



  • wait/notify ist doch aber vom Object und hat was mit synchronized zu tun oder? 😢
    ich glaub du meinst stop/resume ... aber dazu auch besser erst javadocs lesen 😃



  • stop/resume ist deprecated, das sollte man nicht verwenden, weil es zu einer race-condition kommen kann.
    Wie notify in diesem Zusamenhang funktioniert, hab ich noch nicht rausgefunden. Könntest du das bitte etwas genauer ausführen? 🙂



  • Prinzipiell könnte ich mir sowas in der Art vorstellen (ungetestet):

    class ResumableThread extends Thread {
    	boolean outerRunning = true, innerRunning = true;
    	@Override
    	public void run() {
    		while (outerRunning) {
    			while (isRunning()) {
    				// mach was...
    			}
    			synchronized (this) {
    				try {
    					wait();
    				} catch (InterruptedException e) {	}
    			}
    		}
    	}
    
    	public synchronized boolean isRunning() {
    		return innerRunning;
    	}
    
    	public synchronized void pause() {
    	    innerRunning = false;
    	}
    
    	public synchronized void cont() {
    		innerRunning = true;
    		notify();
    	}
    }
    


  • snOOfy schrieb:

    stop/resume ist deprecated, das sollte man nicht verwenden, weil es zu einer race-condition kommen kann.
    Wie notify in diesem Zusamenhang funktioniert, hab ich noch nicht rausgefunden. Könntest du das bitte etwas genauer ausführen? 🙂

    einfach mal die docs lesen ... dann wird das mit notify auch etwas klarer ... vielleicht 🤡



  • Benutze einen Thread Pool, statt direkt mit Threads zu arbeiten. Dort schmeisst Du Runnables rein, wenn Du sie ausführen willst. Die Threads werden vom Thread Pool automatisch recylced.

    Siehe dazu: http://java.sun.com/j2se/1.5.0/docs/guide/concurrency/index.html



  • Ah, der ThreadPool hört sich vielversprechend an, auch wenn das ganze dadurch nicht mehr so einfach zu verstehen ist 😃 Gibt es da gute Tutorials? Ich finde nur (meist nicht kommentierte) .java Dateien mit fertigen ThreadPools und Seiten aus Katalogen mit den Funktionen und Variablen... Ich bin noch ziemlich neu auf dem Gebiet Parallelisierung, ich bräucht irgendwas simpel erklärtes^^



  • Es gibt schon fertig implementierte Thread Pools in der Java API, die in den meisten Fällen ausreichend sind. Lies mal hier:

    http://openbook.galileocomputing.de/javainsel8/javainsel_11_004.htm#mj6a1391d66a88f2636cce4aae07c6ed63


Anmelden zum Antworten