È impossibile terminare un thread a meno che il codice in esecuzione in quel thread non ne consenta la chiusura.
Lei ha detto: "Purtroppo devo uccidere/riavviarlo ... Non ho il controllo completo sui contenuti del filo e per la mia situazione si richiede un riavvio"
Se il contenuto del filo non consente di terminare la sua esecuzione quindi non è possibile terminare quel thread.
Nel tuo post hai detto: "Il mio primo tentativo è stato con ExecutorService, ma io non riesco a trovare un modo per esso riavviare un compito Quando uso .shutdownnow() ...."
Se guarda la fonte di "shutdownnow" che viene appena eseguita e interrompe i thread attualmente in esecuzione.Ciò non interromperà la loro esecuzione a meno che il codice in quei thread controlli per vedere se è stato ineterrupted e, in tal caso, interrompe l'esecuzione stessa. Quindi shutdownnow probabilmente non sta facendo quello che pensi.
Permettetemi di illustrare ciò che intendo quando dico che il contenuto del filo devono consentire quel filo a essere terminato:
myExecutor.execute(new Runnable() {
public void run() {
while (true) {
System.out.println("running");
}
}
});
myExecutor.shutdownnow();
Quel filo continuerà a correre per sempre, anche se shutdownnow è stato chiamato, perché non controlla mai per vedere se è stato terminato o meno. Questa discussione, tuttavia, si spegnerà:
myExecutor.execute(new Runnable() {
public void run() {
while (!Thread.interrupted()) {
System.out.println("running");
}
}
});
myExecutor.shutdownnow();
Da questa discussione controlla per vedere se è stata interrotta/spegnimento/terminato.
Quindi, se si desidera un thread che è possibile chiudere, è necessario assicurarsi che controlli per vedere se è stato interrotto. Se vuoi un thread che puoi "spegnere" e "riavviare" puoi renderlo eseguibile in grado di svolgere nuovi compiti come menzionato prima.
Perché non si può arrestare un thread in esecuzione? Beh, in realtà ho mentito, puoi chiamare "yourThread.stop()" ma perché è una cattiva idea? Il thread potrebbe essere in una sezione del codice sincronizzata (o altra sezione critica, ma ci limiteremo alle definizioni custodite dalla parola chiave sincronizzata qui) quando la interromperai. i blocchi di sincronizzazione dovrebbero essere eseguiti nella loro interezza e solo da un thread prima di poter accedere ad altri thread. Se si interrompe un thread nel mezzo di un blocco di sincronizzazione, la protezione messa in atto dal blocco di sincronizzazione viene invalidata e il programma si troverà in uno stato sconosciuto. Gli sviluppatori fanno roba messa nei blocchi di sincronizzazione per mantenere le cose sincronizzate, se si usa threadInstance.stop() si distrugge il significato di sincronizzazione, cosa lo sviluppatore di quel codice stava cercando di realizzare e come lo sviluppatore di quel codice si aspettava che i suoi blocchi sincronizzati comportarsi.
Per questa domanda è anche possibile fare riferimento a: http://stackoverflow.com/questions/22937592/resume-interrupted-thread – artiethenoble