1. Pontos de conhecimento de interrupção
O resumo a seguir é baseado no JDK8
Este artigo não explicará completamente a interrupção, mas listará apenas alguns pontos mais importantes. Para uma compreensão completa do Thread.Interrupt, você pode ver os materiais de referência.
Aqui estão alguns novos artigos que ajudam a entender as referências:
Depois que o método de interrupção é chamado, o sinalizador de interrupção é definido como true para threads no estado bloqueado. A resposta às interrupções (ciente das alterações nesse bit de sinalizador) depende do design da API. A API de IO de IO do JDK, o bloco de sincronização sincronizado e muitos métodos em bloqueio (excluindo o bloqueio interruptível) não respondem às interrupções. Obviamente, o tópico de chamada pode usar o julgamento do bit sinalizador para fazer com que a API projetada por si só responda às interrupções.
Depois que o método de interrupção for chamado, a interrupção ** será lançada no thread no estado de espera/timed_waiting e o sinalizador de interrupção false ** será definido. Por exemplo, após o thread chama Thread.sleep, object.wait ().
Se o thread não foi iniciado (novo) ou terminou (encerrado), chamando interrupção () não tem efeito nele e o sinalizador de interrupção não será definido.
Prática recomendada: Às vezes, alguns métodos não podem ser interrompidos ou cancelados em design, mas quando outros threads enviam solicitações de interrupção, eles também precisam manter as notas para facilitar outros chamadores para "entender a situação".
Tarefa pública GetNextTask (BlockingQueue <Task> fila) {boolean interromped = false; tente {while (true) {tente {return fileue.take (); } catch (interruptedException e) {// a marca de status de dependência em Fianlly interrompida = true; // cair e tentar novamente}}} finalmente {if (interrompido) // Comente em Fianlly para garantir que não haja falta de thread de notificação de interrupção.CurrentThread (). }}Algumas operações de cancelamento podem ser implementadas usando interrupções. Por exemplo:
pacote concorrente; importar java.util.concurrent.blockingQueue; importar java.util.Concurrent.Callable; importar java.util.concurrent.executorService; import java.util.concurrent.executores;/** ** criado por wanshao * DAT: 2017/112/12. estático void main (string [] args) lança interruptedException {interruptTask interruptTask = new interruptTask (); ExecutorService ExecutorService = Executores.NewsingLeThreadExecutor (); executorService.submit (interruptTask); Thread.sleep (100); interruptTask.cancel (); executorService.shutdown (); }}/*** Uma tarefa que responde à interrupção*/classe interruptTask implementa Callable <Teger> {Private BlockingQueue <Task> Fila; // salve o thread a ser interrompido thread t; @Override Public Integer Call () lança interruptedException {System.out.println ("Inicie uma tarefa bloqueada"); tente {t = thread.currentThread (); Thread.CurrentThread (). Sleep (50000); } catch (interruptedException e) {System.out.println ("ser interrompido"); E.PrintStackTrace (); } retornar 0; } public void cancel () {System.out.println ("CACEL a tarefa ...."); // chamando thread.currentThread () aqui obterá o thread principal, em vez do thread no pool de threads se (! T.isinterrupt ()) {t.interrupt (); }}}Resumir
O exposto acima é a atualização no Java com base no resumo do JDK8 introduzido pelo editor. Espero que seja útil para todos. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a todos a tempo. Muito obrigado pelo seu apoio ao site wulin.com!