1. Введение
В этой статье записываются некоторые знания о механизме прерывания в многопользовании Java. В основном он состоит из разницы между методом остановки, прерванным () и isErensted () методами и выполняет простой анализ из реализации исходного кода.
В Java есть 3 способа прекратить бегущие потоки
① Поток выходит нормально, то есть метод run () был выполнен
② Используйте метод stop () в классе потока, чтобы насильно завершить поток. Однако метод STOP () истек и не рекомендуется использовать его
③ Используйте механизм прерывания
Нечего делать, когда поток выходит нормально. Механизм прерывания введен подробно ниже. Давайте сначала посмотрим на исходный код метода Stop (). Ключ - это комментарии на исходном коде. Это объясняет, почему STOP () небезопасен, какой поток останавливается методом Stop ()?
/*** заставляет поток прекратить выполнение.* <p>* Если установлен диспетчер безопасности, его метод <code> checkaccess </code>* вызывается с <code> this </code>* в качестве аргумента. Это может привести к тому, что* <code> SecurityException </code> будет поднят (в текущем потоке).* <p>* Если этот поток отличается от текущего потока (то есть текущий* поток* пытается остановить поток, отличный от себя), метод* Code Manager <code> </code> (с* <code> runtimessision («Стопторов») </code </code> снова встал* («STOPTHTHREAD»). <code> SecurityException </code> (в текущем потоке).* <p>* Поток, представленный этим потоком, вынужден остановить все, что он делает ненормально, и бросить недавно созданный* <code> Threaddeath </code> объект как исключение.* <p>* Это разрешено остановить поток, который еще не начался. <code> threaddeath </code>, если только он не должен выполнять какую -то экстраординарную* операцию очистки (обратите внимание, что бросок* <code> threaddeath </code> вызывает <code>, наконец, </code> положения* <code> try </code>, которые будут выполнены до выполнения, до того, как поток официально умирает). Если предложение <code> catch </code> объект завораживает* <code> объект Threaddeath </code>, важно пересмотреть объект*, чтобы поток фактически умирал.* <p>* Обработчик ошибок верхнего уровня, который реагирует на иное, не учитывает исключения, не печатает сообщение «Код». Невозможно* изменить этот поток.* @see #interrupt ()* @see #checkaccess ()* @see #run ()* @see #start ()* @see threaddeath* @see threadgroup #uncaughtexception (Thread, Throwable)* @see SecurityManager #CheckCcess (Thread)* @seee Security #checkpermisse* @SeePREPRIVERY THEREPERIVERY THEREPERIVERY THEREPERIVERY. Остановка потока с* потоком. Стоп заставляет его разблокировать все мониторы, которые он* заблокировал (как естественное следствие неверного* <code> threaddeath </code> Исключение, распространяющее стек). Если* какой -либо из объектов, ранее защищенных этими мониторами, был в* противоречивом состоянии, поврежденные объекты становятся видимыми для* других потоков, что потенциально приводит к произвольному поведению. Многие* Использование <code> Stop </code> должно быть заменено кодом, который просто* изменяет некоторую переменную, чтобы указать, что целевой поток должен* прекратить запуск. Целевой поток должен регулярно проверять эту переменную* и возвращать из своего метода запуска упорядоченным образом*, если переменная указывает, что она должна прекратить запуск. Если* целевой поток ожидает длительных периодов (на переменной условия, например,*, например), метод <code> прерывания </code> должен использоваться для* прерывания ожидания.* Для получения дополнительной информации см. Устарел?
Как прокомментировано выше, строки с 9 по 16 указывают на то, что метод Stop () может остановить «другие потоки». Поток, который выполняет метод Thread.stop (), называется текущим потоком, в то время как «Другой поток» - это поток, представленный потоком Object, который вызывает метод Thread.stop ().
нравиться:
public static void main (string [] args) {mythread thread = new mythread ... // .... thread.stop (); // ..}В основном методе текущий поток является основным потоком. Он выполняется до строки 4 и хочет остановить поток «Другой поток». Этот другой поток - это поток, представленный объектом потока нового класса Mythread.
Линии с 21 по 23 указывают, что нить, которая еще не была запущена, может быть остановлен. Его эффект: когда поток запускается, он сразу заканчивается.
Комментарии после строки 48 глубоко показывают, почему метод Stop () устарел! Почему это небезопасно.
Например, Threada Thread имеет мониторы, которые отвечают за защиту определенных критических ресурсов, таких как сумма банковских переводов. Когда процесс передачи вступает в процесс, главный поток вызывает метод threada.stop (). В результате монитор выпускается, и ресурсы, которые он защищает (количество передачи), вероятно, будут непоследовательными. Например, учетная запись A снизилась на 100, а учетная запись B не увеличилась на 100.
Во -вторых, механизм прерывания
Есть слишком много деталей о том, как правильно использовать механизм прерывания в Java. Оба прерванных () и ISERENTRUPTED () методы отражают, находится ли текущий поток в прерываемом состоянии.
① прерван ()
/*** проверяет, был ли текущий поток прерван. * <i> прерванный статус </i> потока очищается этим методом. In* other words, if this method were to be called twice in succession, the* second call would return false (unless the current thread were* interrupted again, after the first call had cleared its interrupted* status and before the second call had examined it).** <p>A thread interruption ignored because a thread was not alive* at the time of the interrupt will be reflected by this method* returning false.** @return <code>true</code> if the current thread has been прервано;* <code> false </code> в противном случае.* @see #IsEnterrupted ()* @Revised.*/public static boolean прерывания () {return currentThread (). isErengrated (true);}Из комментариев в исходном коде он проверяет состояние прерывания текущего потока, и этот метод очистит состояние прерывания.
②IsErenptorted ()
/*** проверяет, был ли этот поток прерван. За этим методом не влияет <i> Status </i> потока. isErengrupted () {return isErendtupted (false);}Как видно из комментариев исходного кода, метод isErenprated () не очистит состояние прерывания.
③ Дифференциация между методом прерванного () и методом isErenprated ()
Как видно из исходного кода, оба метода называются ISERUPRUPTED (BOOLEAN CLEAREVERPREPTED), за исключением того, что один с параметром является истинной, а другой с параметром является ложным.
/*** тесты, если какой -то поток был прерван. Прерываемое состояние* сброшено или не основано на значении прозрачного, которое* передается.*/Частный нативный логический - это прерывания (логический прозрачный);
Следовательно, первое отличие состоит в том, что один очищает бит флага прерывания, а другой не очищает бит флага прерывания.
После анализа исходного кода вы можете увидеть вторую разницу в операторе возврата:
Public Static Boolean прерывания () {return CurrentThread (). IseReverrupted (true);}/***********************/Public Boolean isErengtted () {return isErenptated (false);}Прекращенный () проверяет прерываемое состояние текущего потока. IsErengroupted () проверяет поток, представленный объектом, который вызывает метод. Один из них является статическим методом (он проверяет состояние прерывания текущего потока), а другой - метод экземпляра (он проверяет состояние прерывания потока, представленное объектом экземпляра).
Ниже приведен конкретный пример для дальнейшего прояснения этой разницы.
Есть пользовательский класс потоков следующим образом:
Открытый класс Mythread Extends Thread {@OverridePublic void run () {super.run (); for (int i =; i <; i ++) {System.out.println ("i =" + (i +));}}}Давайте сначала посмотрим на пример метода прерванного ():
открытый класс run {public static void main (string [] args) {try {mythread thread = new Mythread (); Thread.start (); Think.Sleep (); Thread.Intertrupt (); // Thread.currentThread (). Enterrupt (); System.out.println ("stop? // ...Строка 5 запускает потоковое значение, а линия 6 заставляет основной резьбой спать в течение 1 секунды, так что потоковая потока имеет возможность получить выполнение ЦП.
После того, как основной поток спит в течение 1 с, он возобновляет выполнение до строки 7 и просит прервать поток потока.
Строка 9 проверяет, находится ли поток в прерванном состоянии. Какая ветка здесь тестируется? ? ? Ответ - основная ветка. потому что:
(1) прерван () проверяет состояние прерывания текущего потока
(2) Главный поток выполняет оператор 9 -й строки, поэтому основной поток - текущий поток
Давайте посмотрим на пример метода isErengeted ():
Открытый класс run {public static void main (string [] args) {try {mythread thread = new mythread (); thread.start (); thread.sleep (); thread.interrupt (); System.out.println ("Это останавливается?В строке 8 метод ISERENSERRUPTED () вызывается объектом потока. Следовательно, состояние прерывания потока, представленное объектом потока, протестируется. Поскольку онлайн 7, основной поток просит прервать поток потока, результат в строке 8: true