7
votes

Comment faire dormir un autre fil en Java

J'ai une classe qui étend le fil. Ce fil lors de l'exécution dépense la majeure partie de son sommeil, il effectuera un chèque, si true Effectuera une action simple, puis dormez pendant 1/2 seconde et répétez.

La classe a également une méthode publique appelée par d'autres threads . Si cela s'appelle, je veux que le fil dorme plus longtemps s'il coule déjà ou dormez immédiatement si ce n'est pas le cas. J'ai essayé d'avoir cela.sleep mais il semble que cela dort toujours du fil actuel et qu'il se plaint que le sommeil de la méthode est statique et doit être accès statique.

Ce programme montre mon problème, lorsque CAUSELEP est appelé, je souhaite qu'il arrête d'imprimer des nombres jusqu'à ce que le sommeil soit terminé. xxx

La sortie que je reçois est xxx


0 commentaires

3 Réponses :


25
votes

Vous ne pouvez pas dormir un autre fil. (Vous pouvez utiliser la méthode code> suspension () déprécée () code>, mais s'il vous plaît ne pas). Cet appel:

this.sleep(200);


0 commentaires

1
votes

En fait, pour dire au fil Dormir plus longtemps , je suggère que votre méthode spéciale mémoriserait ce fait dans un champ volatil. Ensuite, le fil d'intérêt doit lire cette variable et dormir plus longtemps si set.

Maintenant, pour le faire Dormir immédiatement , vous devez interrompre le fil. Cela lancera une exception pour arrêter le traitement actuel. Maintenant, vous devez faire face à cela ... Pensez si c'est vraiment ce que vous voulez.

Une autre solution serait, dans l'activité du fil de fil normal, de sonder également la variable comme dans le premier cas et de dormir si elle est définie. Cela serait ne causerait pas de sommeil immédiat , mais cela pourrait être assez rapide, et l'interruption serait à des points spéciaux de votre code où vous savez que vous pouvez arrêter sans casser les choses ...


0 commentaires

4
votes

Ajoutez ceci à votre fil: xxx pré>

in exécuté () code>: p> xxx pré>

dans l'autre Fil: P>

synchronized (lock) {
try {
    sleeper.waitLonger.set(true);
    ...
    lock.notify();
    sleeper.waitLonger.set(false);
}


0 commentaires