1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| class ExThread extends Thread {
// Le mot clef 'volatile' indique que la valeur de l'attribut
// peut être modifié depuis différents threads.
// Cela interdit donc à la JVM d'optimiser la lecture de la valeur exacte
// lors de chaque accès à cette variable.
// Sans ce mot-clef, la JVM pourrait optimiser le code et ne pas détecter
// des modifications depuis un autre thread :
private volatile boolean paused;
/**
* Change l'état 'paused' du thread. Cet état est juste informatif, et doit
* être repecté par la méthode run() du thread en question.
*/
public void setPaused(boolean b) {
if (this.paused != b) {
synchronized (this) {
// On se contente de modifier la valeur du boolean :
this.paused = b;
if (!this.paused) {
// Et de notifier le thread lors du passage à 'false'
this.notifyAll();
}
}
}
}
/**
* Indique l'état 'paused' du thread.
*/
public boolean isPaused() {
// Accès en lecture : pas besoin de synchronisation
return this.paused;
}
/**
* Indique si le thread est réellement en pause, c'est à dire s'il est dans
* l'état 'paused' ET dans un wait().
*/
public boolean isTrulyPaused() {
return isPaused() && getState() == State.WAITING;
}
/**
* Méthode statique qui vérifie l'état du thread courant. Cette méthode doit
* être appellé à étape régulière par la méthode de traitement du thread...
*
* @throws InterruptedException
* Le thread a reçu un interrupt()
*/
public static void checkCurrentThread() throws InterruptedException {
// On récupère le thread courant :
final Thread thread = Thread.currentThread();
// On vérifie d'abord le status 'interrupted',
// qui indique si l'on doit terminer le thread ou pas :
if (thread.isInterrupted()) {
// On remonte une exception pour stopper le thread :
throw new InterruptedException("interrupted");
}
// Puis si le thread est un ExThread :
if (thread instanceof ExThread) {
final ExThread exThread = (ExThread) thread;
// S'il est en état 'paused' :
if (exThread.isPaused()) {
synchronized (exThread) {
// On endors le thread TANT qu'il ne
// recoit pas de notify() ou d'interruption
// (la boucle while() permet de se protéger
// de certain réveils intempestifs assez rare)
while (exThread.isPaused()) {
exThread.wait();
}
}
}
}
}
} |
Partager