Threads wollen weder schlafen noch aufgewckt werden!

Status
Nicht offen für weitere Antworten.

dotlens

Top Contributor
hallo

ich glaub ich werd noch!!!!!!

dauernd kommt diese Exception:
java.lang.IllegalMonitorStateException: current thread not owner

ich hab in der API nachgeschaut, dort wird aber nicht gerade viel geschrieben :s

das heisst doch dass der Thread im moment nicht am laufen ist, oder? (owner der prozessors)


habe eine klasse die Threads instanziert. Die threads sollen vorerst alles schlaffen und dann per Buttonklick aufgeweckt werden...
nicht so schwirig, hab ich mir gedacht, und folgendes gemacht:

so sehen alle meine Threads aus:
Code:
class kopierenAlleNeuenSymbole extends Thread{
	public void run(){
		try {
			while(true)
				this.wait();
		}
		catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("ich kopiere alle neuen(Symbole)");	
	}
}

hier erstelle ich sie:
Code:
	public void kopierenAlleNeuen(int welche) throws InterruptedException {
		Thread kans = new Thread(new kopierenAlleNeuenSymbole());
		Thread kanf = new Thread(new kopierenAlleNeuenFormen());
		switch (welche) {
			case 1:
				kans.start();
				kanf.start();
				notifyAll();
			break;
			case 2:
				kans.start();
				kanf = null;
			break;
			case 3:
				kanf.start();
				kans = null;
			break;
		}
	}

wo ligt der Fehler??? bitte dringenst um Hilfe!

danke und gruss
 
Nimm nicht wait() und notify();
Da du mit notifyAll alle Thread aufweckst....Also auch solche, die der VM intern gehören...😉
Nimm Thread.sleep() ...
Um sie aufzuwecken kannst du einfach einen interrupt senden...
wait ist ok, wenn du z.B.: Semaphore implementieren willst..
 
ich bin kein Thread fachmann, aber du hast ja keinerlei Objekt auf dem synchronisiert ist ?! wait & notfiy müssen sich immer in einem synchronized Block befinden!

schau mal hier: java ist ne insel

edit: warum kommt mein Fehler

@meez: warum sollte er vom Prinzip kein wait & notify nehmen - ich halte es besser als sleep und dann ständig überprüfen ob man weitermachen sollte oder nicht ?!
 
das Problem ist, dass sie sich nicht kennen.... deshalb hab ich das wait() und notify() genommen.
hab aber nicht gewusst dass ich damit auch in der VM was aufwecke 😉

synchronized hab ich sie noch gemacht, ist aber immer noch der selbe fehler...
 
hab den Fehler gefunden: hab eine methode gemacht um threads in den wartezustand zu bringen, und dieser methode den Thread übergeben. damit hatte der compiler ein problem, man darf anscheinend nicht thread.wait(); gebrauchen sondern bloss wait()

kann man denn nicht andere Threads in den wartezustand versetzen??

danke für die hilfe!
 
schau dir bitte den Link an den ich oben gepostet habe, da ist es recht gut erklärt !!
 
sorry hab deinen lzuerst nur deinen zweiten link angesehen. bin jezt schon so lange an dem problem, dass ich n bisschen die geduld verliere. nach dem mittagessen ists dann wieder gut so wie ich mich kenne... 😉

hab jetzt deinen Link gründlich studiert, hab aber den fehler nicht gefunden... 🙁

es wird der selbe fehler ausgegeben ,wenn ich den Thread nicht im Thread selber in den Wartezustand verseze... obwohl ich die methode synchronized habe. sogar doppelt!!! :S (doppelt gemoppelt hält besser, dacht ich zumindest)

hier mien code:
Code:
public synchronized void kopierenAlleNeuen(int welche) throws InterruptedException {
		Thread kans = new Thread(new kopierenAlleNeuenSymbole());
		Thread kanf = new Thread(new kopierenAlleNeuenFormen());
		switch (welche) {
			case 2:
				kans.start();
				kanf.start();
				synchronized(kans){
					kans.wait();
					//kans.notify();
				}
				synchronized(kanf){
					kans.wait();
					//kanf.notify();
				}
			break;
			case 11:
				kans.start();
				kanf = null;
			break;
			case 12:
				kanf.start();
				kans = null;
			break;
		}
	}
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben