В этой статье мы поговорим о механизме прерывания прерывания потока Java.
Прерывание потока
Метод потока. Он установит бит состояния прерывания потока, то есть установить на TRUE. Независимо от того, умирает ли прерванный поток, ожидает новой задачи или продолжает работать до следующего шага, зависит от самой программы. Поток будет время от времени обнаруживать этот флаг прерывания, чтобы определить, следует ли прервать поток (верно ли флаг прерывания). Он не прерывает работающий поток, как метод остановки.
Определите, прерывается ли поток
Чтобы определить, отправил ли поток запрос прерывания, пожалуйста, используйте метод Thread.currentThread (). IsErengeTed () Метод (потому что он не очистит бит флага прерывания сразу после установки бита флага прерывания потока на TRUE, то есть он не установит флаг прерывания на FALSE). Вместо этого не используйте метод Thread.Eruprupted () (бит флага прерываний будет очищен после того, как метод будет вызван, то есть сбросить к False) метод для суждения. Ниже приведен метод прерывания потока, когда он находится в цикле:
while (! thread.currentThread (). isErengeTrupted () && больше работы) {сделайте больше работы}Флаг состояния прерывания
В механизме прерывания прерывания есть следующие методы:
Следовательно, механизм прерывания прерывания на самом деле не прерывает текущий поток, а изменение в разметке прерывания. Давайте сначала проверим его с примерами.
Public Class EnterruptStest {// потребляемое здесь время используется для печати частного статического долгого времени = 0; private static void seettime () {time = system.currenttimemillis (); } private static void printContent (String Content) {System.out.println (Content + "Time:" + (System.currentTimeMillis () - Time)); } public static void main (string [] args) {test1 (); } private static void test1 () {Thread1 Thread1 = new Thread1 (); Thread1.start (); // прерывание прерывания через 3 секунды задержки try {thread.sleep (3000); } catch (прерванное искусство e) {e.printstacktrace (); } thread1.interrupt (); printContent ("прерывание выполнения"); } private Static Class Thread1 Extends Thread {@Override public void run () {resettime (); int num = 0; while (true) {if (is isErengrated ()) {printContent («текущий поток ISERENTRUPTED»); перерыв; } num ++; if (num % 100 == 0) {printContent ("num:" + num); }}}}}}}Приведенный выше код должен запустить поток Thread1 и непрерывно добавить 1 к NUM в цикле потока потока Thread1 и распечатать его один раз каждые из 100 (предотвращайте слишком быструю печать). Затем, после сна в течение 3000 миллисекунд, главный поток вызывает метод прерывания потока потока 1. Тогда давайте посмотрим на вывод:
прерывание прерывания
Можно видеть, что после того, как он взял около 3000 миллисекунд, то есть после того, как основная резьба спит, потока потока 1 останавливается, и потока потока 1 останавливается, потому что метод Isretrupted в цикле while возвращает True, поэтому Break выходит из петли while. То есть роль прерывания и бегаемого здесь эквивалентна роли SETXX и GETXX, поддерживая логическую переменную.
прерывание обработки исключений
Конечно, механизм прерывания - это не просто изменение и обнаружение битов статуса прерывания, он также может обрабатывать исключения прерывания. Мы знаем, что метод Thread.sleep () должен поймать исключение прерывания, поэтому давайте добавим в него задержку сна и попробуем
while (true) {if (is isErengtted ()) {printContent («текущий поток ISERENTRUPTED»); перерыв; } num ++; // Sleep Try {thread.sleep (1); } catch (прерванное искусство e) {e.printstacktrace (); } if (num % 100 == 0) {printContent ("num:" + num); }}Давайте посмотрим на результат вывода:
прерывание прерывания
Здесь мы обнаружим, что после сна выходное числовое значение значительно меньше (NUMS достигает 1 миллиарда, когда они не спят, и кажется, что процессор очень быстро выполняет простые операции). Ха -ха, но это не главное. Точка состоит в том, что после выходного исключения вывод IseRuprupted возвращает FALSE, а поток Thread1 продолжает выполняться и не выходит из петли WHILE. Так почему же это? Мы только что добавили сон.
Если в потоке Thread1 есть операция, которая должна поймать исключение прерванного эктриэкцепции, такое как сон потока, метод соединения, ожидание объекта, ожидание условия и т. Д., Это заставит исключение прерванного эктриэкцепции, тогда при вызове потока 1. Interrut Затем, в цикле Whice, это исключение можно поймать, а затем после того, как это исключение будет сброшено, флаг прерывания потока будет сразу же сброшен до FALSE. Следовательно, когда он прерывается в следующий раз, когда цикл, который определяется как ложный, он не сломается, а затем цикл while будет продолжать выполняться.
Следовательно, метод Enterrupt () будет выполнять различные операции на основе того, есть ли код в методе выполнения в потоке потока, который должен поймать прерывание.
Сценарии применения прерывания
Обычно прерывание подходит для суждений по маркетинге в выполнении потока, например,
while (! isErengreting ()) {...} Однако, если в этом цикле есть закупорка, поток не может судить о следующей мебели, и даже если метод Enterrupt () вызван, он не может выйти из цикла, и поток не может выйти. Например
while (! isErengeTed ()) {... while (true) {// Поток застрял здесь, прерванный механизм нельзя ответить}}}}}}}}}}}.Таким образом, прерывание будет беспомощным, и поток будет продолжать выполняться и не будет прерываться и остановлен.
Тестовые примеры для просмотра моего GitHub-Javatest
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.