Il est impossible de mettre fin à un fil, à moins que le code qui s'exécute dans le thread vérifie et autorise la résiliation.
Vous avez dit: "Malheureusement, je dois tuer/redémarrer ... je n'ai pas le contrôle complet sur le contenu de la discussion et pour ma situation, il nécessite un redémarrage"
Si le contenu du fil ne permettent pas la résiliation de son exectuion alors vous ne pouvez pas mettre fin à ce thread.
Dans votre post, vous avez dit: "Ma première tentative a été avec ExecutorService mais je n'arrive pas à trouver un moyen pour qu'il redémarrer une tâche. Lorsque j'utilise .shutdownnow()..."
Si vous regardez le code source de "shutdownnow" il traverse et interrompt les threads en cours d'exécution. Ce ne sera pas cesser de leur exécution, sauf si le code dans les discussions des vérifications pour voir si elle a été ineterrupted et, dans l'affirmative, s'arrête l'exécution elle-même. Donc shutdownnow est probablement pas faire ce que vous pensez.
Permettez-moi d'illustrer ce que je veux dire quand je dis que le contenu de la thread doit permettre que le fil à la fin:
myExecutor.execute(new Runnable() {
public void run() {
while (true) {
System.out.println("running");
}
}
});
myExecutor.shutdownnow();
Ce thread va continuer à courir pour toujours, même si shutdownnow a été appelé, car il ne vérifie s'il a été résilié ou non. Ce fil de discussion, cependant, va s'arrêter:
myExecutor.execute(new Runnable() {
public void run() {
while (!Thread.interrupted()) {
System.out.println("running");
}
}
});
myExecutor.shutdownnow();
Depuis ce thread vérifie pour voir si oui ou non il a été interrompu / arrêt / fin.
Donc, si vous voulez un fil que vous pouvez arrêter, vous devez vous assurer qu'elle vérifie si elle a été interrompue. Si vous voulez un sujet que vous pouvez "arrêter" et "redémarrer", vous pouvez faire un exécutable qui peut prendre de nouvelles tâches comme il a été mentionné avant.
Pourquoi ne pouvez-vous pas arrêter un thread en cours d'exécution? Eh bien, j'en fait menti, vous pouvez l'appeler "yourThread.stop()" mais pourquoi est-ce une mauvaise idée? Le fil pourrait être synchronisés (ou d'autres de la section critique, mais nous nous limiterons à setions gardé par le syncrhonized mot clé ici) section de code lorsque vous l'arrêtez. synchroniser les blocs sont censés être exécutée dans leur entirity et par un seul thread avant d'être consulté par un autre thread. Si vous arrêter un thread dans le milieu d'une synchronisation de bloc, la protection mis en place par la synchronisation de bloc est invalidé et que votre programme va entrer dans un état inconnu. Les développeurs à mettre des choses dans la synchronisation des blocs de garder les choses en synchro, si vous utilisez threadInstance.stop() vous détruire le sens de la synchronisation, ce que le développeur de ce code tente d'accomplir et comment le développeur de ce code devrait son synchronisé blocs à se comporter.