Quel est l'Avenir.annuler() faire si pas interrompre?
De java docs sur le Futur.annuler()
boolean cancel(boolean mayInterruptIfRunning)
Tente d'annuler l'exécution de cette tâche. Cette tentative échouera si la tâche a déjà achevée, a déjà été annulée, ou ne peut pas être annulée pour une autre raison. En cas de succès, et cette tâche n'a pas commencé lors de l'annulation est appelée, cette tâche ne doit jamais fonctionner. Si la tâche a déjà commencé, puis le mayInterruptIfRunning paramètre détermine si le fil de l'exécution de cette tâche doit être interrompu dans une tentative pour arrêter la tâche.
Ma question est: que fait annuler le faire si mayInterruptIfRunning est faux?
comment est-il annuler ou arrêter la tâche de s'exécuter si il a déjà été exécuté?
OriginalL'auteur Tom | 2014-01-29
Vous devez vous connecter pour publier un commentaire.
Si elle n'est pas interrompant il suffit de dire à l'avenir, ce qui est annulée. Vous pouvez le vérifier via
isCancelled()
mais rien ne se passe si vous ne cochez pas que manuellement.Ci-dessous un exemple de code montre comment vous pourriez le faire.
La tâche est démarrée, et après 1,5 itérations dit d'arrêter. Il va continuer à dormir (ce qui ne serait pas si vous avez interrompu), puis sur terminer.
Notez qu'il n'y aurait aucun moyen de vérifier
isCancelled()
, par exemple, leCallable.call
- il ne pouvait vérifier si elle a été interrompue.voir mise à jour de réponse. Vous avez besoin d'ajouter un peu de moyen pour faire référence à la
Future
de l'intérieur de laCallable
pour faire ce travail.Ok, mais qui semble un peu bizarre et auto-destructeur.
while (!Thread.interrupted()) {
aurait plus de sens.Oui, généralement, je le faire et de dire
task.cancel(true)
parce que c'est accessible viaThread.interrupted()
. Avecfalse
vous n'obtiendrez jamaisThread.interrupted()
retourne true car il n'a pas l'interrompre. Je n'ai pas trouvé beaucoup d'utilisation pourcancel(false)
ou un modèle de la façon dont vous n'avez pas à utiliser laid références à l'extérieur 🙂OriginalL'auteur zapl
Si la tâche a déjà commencé à courir, et
mayInterruptIfRunning
estfalse
, alors il n'y a rien à faire. En Java, interrompre un thread est considéré comme la seule façon de l'arrêter court de la date d'achèvement, et même que requiert la tâche de "se conformer" par la vérification de l'interruption de certains de la mise en œuvre spécifique de l'intervalle.Connexes: Comment voulez-vous tuer un thread en Java?
OriginalL'auteur Paul Bellora
rien ne sera fait si la tâche a déjà commencé et mayInterruptIfRunning est faux,
ci-dessous est l'annuler()
nous pouvons voir que si mayInterruptIfRunning est faux,annuler() il suffit de changer l'état de NEW ANNULÉE et le retour de faux,rien ne sera fait
OriginalL'auteur Slogen