Java threads : wait() & notify()

Java threads : wait() & notify() - Java - Programmation

Marsh Posté le 07-01-2007 à 13:17:33    

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 :
  1. public class ControllableThread extends Thread implements Controllable
  2. {
  3. public enum ThreadActiveStatus { paused, running };
  4. public enum ThreadCommand { start, stop };
  5. private ThreadActiveStatus activeStatus;
  6. private ThreadCommand command;
  7. private Job job;
  8. private ThreadStatusListener listener;
  9. private ExecutionLock lock;
  10. public ControllableThread(ExecutionLock arg0)
  11. {
  12.  super();
  13.  this.lock = arg0;
  14.  this.job = null;
  15. }
  16. public void run()
  17. {
  18.  while (true)
  19.  {
  20.   this.lock.getMonitor();
  21.   if (this.job != null)
  22.   {
  23.    while (this.command == ThreadCommand.start)
  24.    {
  25.     // on ns a pas demandé d'arreter, alors, on continue...
  26.     this.setActiveStatus(ThreadActiveStatus.running);
  27.     this.job.jobRun();
  28.    }
  29.    //le thread a été mis en pause.
  30.    this.setActiveStatus(ThreadActiveStatus.paused);
  31.    try
  32.    {
  33.     this.lock.wait();
  34.    }
  35.    catch (InterruptedException e) {}
  36.   }
  37.  }
  38. }
  39. private void setActiveStatus(ThreadActiveStatus activeStatus)
  40. {
  41.  this.activeStatus = activeStatus;
  42.  if (this.listener != null)
  43.  {
  44.   this.listener.onThreadStatusUpdate(this.activeStatus);
  45.  }
  46. }
  47. public ThreadActiveStatus getActiveStatus()
  48. {
  49.  return activeStatus;
  50. }
  51. public void setJob(Job arg0)
  52. {
  53.  this.job = arg0;
  54. }
  55. }


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

Code :
  1. public class ExecutionLock
  2. {
  3. private int  monitorNumber = 0;
  4. public ExecutionLock()
  5. {}
  6. public synchronized void getMonitor()
  7. {
  8.  this.monitorNumber++;
  9. }
  10. }


 
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?  :cry:

Reply

Marsh Posté le 07-01-2007 à 13:17:33   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed