1. Перебив точки знаний
Следующее резюме основано на JDK8
Эта статья не будет полностью объяснить прерывание, но будет перечислять только несколько более важных моментов. Для полного понимания потока.
Вот несколько новых статей, которые помогают понять ссылки:
После того, как метод прерывания называется, флаг прерывания устанавливается на истину для потоков в заблокированном состоянии. Отвечать ли прерывания (зная об изменениях в этом бите флага), зависит от дизайна API. Блокирование JDK IO API, синхронизированный блок синхронизации и многие методы в блокировке (исключая блокировку) не реагируют на прерывания. Конечно, вызывающий поток может использовать суждение флагского бита, чтобы сделать API, разработанный сам по себе, отвечать на прерывания.
После того, как метод прерывания будет вызван, прерываноэкспений ** будет добавлено на поток в состоянии ожидания/timed_waiting, и будет установлен флаг прерывания. Например, после того, как поток вызывает Thread.sleep, object.wait ().
Если поток не начался (новый) или закончился (прекращено), вызов Enterrupt () не влияет на него, и флаг прерывания не будет установлен.
Лучшая практика: иногда некоторым методам не разрешается прерывать или отменен в дизайне, но когда другие потоки отправляют запросы на прерывание, они также должны держать оценки, чтобы облегчить другим вызывающим абонентам «понять ситуацию».
Общественная задача GetNextTask (Blockqueue <Task> queue) {Boolean прерывается = false; try {while (true) {try {return queue.take (); } catch (прерванная экспрессия e) {// отметка статуса зависимости в Fianlly прерван = true; // провалиться и повторить}}} Наконец {if (прервано) // Примечание в Fianlly, чтобы убедиться, что не хватает поток уведомления о прерывании. CurrentThread (). Enterrupt (); }}Некоторые операции отмены могут быть реализованы с использованием прерываний. Например:
Пакет одновременный; импорт java.util.concurrent.blockqueue; import java.util.concurrent.callable; import java.util.concurrent.executorservice; import java.util.concurrent.executors;/** ** ** ПЕЕЛЬКО {public static void main (string [] args) бросает прерывание {enterruptSk enterruptSk = new EnterruptSk (); Executorservice executorservice = executors.newsingleThreadExeCutor (); executorservice.submit (EnterruptTask); Thread.sleep (100); enterruptSk.cancel (); executorservice.shutdown (); }}/*** Задача, которая отвечает на прерывание*/класс Enterruptask реализует Callable <Integer> {private blockqueue <task> queue; // Сохранить поток, чтобы быть прерванным потоком T; @Override public integer call () throws urruptedException {system.out.println ("запустить заблокированную задачу"); try {t = Thread.currentThread (); Thread.currentThread (). Sleep (50000); } catch (прерывание Exception e) {System.out.println ("быть прерванным"); e.printstacktrace (); } return 0; } public void cancel () {System.out.println ("cacel a task ...."); // вызов Thread.currentThread () здесь получит основной поток, а не поток в пуле потоков if (! T.isinterrupt ()) {t.interrupt (); }}}Суммировать
Выше приведено обновление в Java на основе резюме JDK8, представленного редактором. Я надеюсь, что это будет полезно для всех. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит всем вовремя. Большое спасибо за вашу поддержку сайту wulin.com!