[resolu] [JAVA][Threads] wait() et notify()

Bonjour,

voilà, j’essaye de gerer (tant bien que mal) la pause ds l’execution d’un thread. Pour pas avoir a réécrire ce code, j’ai créé une classe ControllableThread comme suit :

[code]public class ControllableThread extends Thread implements Controllable
{
public enum ThreadActiveStatus { paused, running };
public enum ThreadCommand { start, stop };
private ThreadActiveStatus activeStatus;
private ThreadCommand command;
private Job job;
private ThreadStatusListener listener;
private ExecutionLock lock;

public ControllableThread(ExecutionLock arg0)
{
	super();
	this.lock = arg0;
	this.job = null;
}

public void run()
{
	while (true) 
	{
		this.lock.getMonitor();
		if (this.job != null) 
		{
			while (this.command == ThreadCommand.start)
			{
				// on ns a pas demandé d'arreter, alors, on continue...
				this.setActiveStatus(ThreadActiveStatus.running);
				this.job.jobRun();
			}
			//le thread a été mis en pause.
			this.setActiveStatus(ThreadActiveStatus.paused);
			try 
			{
				this.lock.wait();
			} 
			catch (InterruptedException e) {}
		}
	}
}

private void setActiveStatus(ThreadActiveStatus activeStatus) 
{
	this.activeStatus = activeStatus;
	if (this.listener != null)
	{
		this.listener.onThreadStatusUpdate(this.activeStatus);
	}
}

public ThreadActiveStatus getActiveStatus() 
{
	return activeStatus;
}

public void setJob(Job arg0)
{
	this.job = arg0;
}

}[/code]

l’ExecutionLock est un objet simple qui est censé me permettre de lancer le travail du thread.

[code]public class ExecutionLock
{
private int monitorNumber = 0;
public ExecutionLock()
{}

public synchronized void getMonitor()
{
	this.monitorNumber++;
}

}[/code]

La méthode est totalement bateau, elle permet d’obtenir le monitor sur l’objet, comme le dit si bien la javadoc.

Donc, ici, si je lance le thread, il est censé se mettre directement en pause, car le champ command est a stop.
Ce qu’il fait donc, mais la ligne this.lock.wait() renvoie une exception IllegalMonitorStateException().

Je ne comprends pas pourquoi le lock m’envoie cette exception, vu que le thread a pris le monitor de cet objet 13 lignes plus haut??
Une idée? B)

voilà la guele d’un des projets qu’un a rendu :

[code]protected Thread threadSimulation = null;

public void demarre() {
threadSimulation = new Thread(this);
threadSimulation.start();
}

public void arrete() {
	threadSimulation = null; // ceci sera testÈ dans le run()
}[/code]

Et this c’est un simulateur qui implemente Runable

oui ms je cherche juste a le mettre en pause afin qu’il se relance aussi tot apres avoir fait un notify() sur le lock… Toi tu le détruits la, non?


ahah ... si je fais comme toi... Désolé mais je sais pas, mais la réponse m'intéresse

ahah … si je fais comme toi… Désolé mais je sais pas, mais la réponse m’intéresse

bien, j’ai posé la question dans le forum de sun, et j’ai eu ma réponse:
J’avais mal compris la documentation. En fait, le monitor sur l’instance lock est bien obtenu lorsque j’invoque la méthode ‘getMonitor’, mais il est relaché des que je sors du bloc de la methode. C’est pourquoi j’obtiens l’exception.