Понимать потоки
концепция
Поток - это поток выполнения в программе. Виртуальная машина Java позволяет приложениям одновременно запускать несколько потоков выполнения.
Функции потока
Имеет состояние, которое представляет состояние потока. В то же время, нить в JVM имеет только одно состояние;
·НОВЫЙ
Потоки, которые еще не начались (потоки, которые не начались с момента начала программы)
・ Забегание
Заполнимый поток, который работает в JVM, но может ждать других ресурсов, таких как процессор.
・ Заблокировано
Блокирующая нить, ожидая, когда замок позволит ему продолжить работу
·ОЖИДАЮЩИЙ
Бесконечное ожидание (запустите снова на потоке, который полагается на то, чтобы позволить ему войти в это состояние, чтобы выполнить определенную операцию)
・ Timeed_waiting
Ожидание времени (запустите снова на потоке, который полагается на то, чтобы позволить ему войти в это состояние для конкретной операции в указанное время ожидания)
・ Прекращен
Выйти поток
Иметь приоритет и определить порядок выполнения потоков;
Целое число между 1 и 10, чем значение по умолчанию составляет 5. Чем выше значение, тем выше вероятность выполнения, а приоритет не определяет порядок выполнения потока.
Приоритет детского потока такой же, как у родительского потока по умолчанию.
Обратите внимание, что JVM перестанет выполнять все потоки, когда:
Вызван метод выполнения () выполнения (время выполнения), и вызов метода разрешен менеджером безопасности;
Все «нить не-дамон» перестали работать (независимо от того, останавливаются ли они нормально или остановку);
Может быть помечен как демон (демон)
Детская нить потока демона все еще остается нитью демона;
Поток Daemon также представляет собой «бэкэнд-поток», который обычно используется для выполнения фоновых задач, в то время как пользовательский поток обычно выполняет задачи на уровне пользователя.
Методы прекращения потока
1. Используйте флаг Exit, чтобы нормально выходить из резьбы, то есть поток заканчивается после завершения метода выполнения.
Когда метод запуска будет выполнен, поток выйдет. Но иногда метод запуска никогда не заканчивается. Например, использование потоков для прослушивания запросов клиентов в серверных программах или других задач, которые требуют обработки цикла. В этом случае эти задачи обычно помещаются в петлю, например, во время петли. Если вы хотите, чтобы цикл работал навсегда, вы можете использовать в то время как (true) {...}, чтобы справиться с ним. Однако, если вы хотите сделать выходной цикл в определенном состоянии, наиболее прямой способ состоит в том, чтобы установить флаг логического типа и контролировать, выходит ли while Loop, установив этот флаг на True или False. Вот пример завершения потока, используя флаг выхода.
Flagexitthread.java
Package com.rainmonth;/*** Создан Randyzhang на 2017/3/23.*/public class flagexitthread extends intear {public volatile boolean isexit = false; public flagexitthread (String name) {Super (name);}@override public run () {while (! isexit) {System.out.Print.print (") {while (! ISexit) {System.out.Print.Democlient.java
Пакет com.rainmonth;/*** создан Рэндижангом на 2017/3/23. = new FlagexitThread (flagexitthread.class.getSimplEname ()); flagexitThread.Start (); try {thread.sleep (1000); flagexitThread.isexit = true; flagexitthread.join (); System.out.println ("Thread Exit");} Catchceptexceptex e) {e.printstackTrace ();}} private static void eSitbyintrupt () {flagexitthread flagexitthread = new flagexitthread (flagexitthread.class.getsimplename ()); System.out.println ("flagexitthread running ..."); flagexitthread. {Thread.sleep (1500); System.out.println ("flagexitthread прерывается ..."); flagexitthread.interrupt (); thread.sleep (1500); System.out.println ("stop Application ...");} catch (InterruptException e) {e.printstacktrace ();Результат вывода:
Распечатайте кучу я бега после выхода ветки.
2. Используйте метод остановки, чтобы насильственно завершить поток (этот метод не рекомендуется, потому что остановка совпадает с приостановкой и резюме, а также может иметь непредсказуемые результаты).
Показывает метод вызова STOP (). Описание stop () в исходном коде выглядит следующим образом:
/** Этот метод по своей природе небезопасен. Остановка потока с* потоком. Стоп заставляет его разблокировать все мониторы, которые он* заблокировал (как естественное следствие неверного* <code> threaddeath </code> Исключение, распространяющее стек). Если* какой -либо из объектов, ранее защищенных этими мониторами, был в* противоречивом состоянии, поврежденные объекты становятся видимыми для* других потоков, что потенциально приводит к произвольному поведению. Многие* Использование <code> Stop </code> должно быть заменено кодом, который просто* изменяет некоторую переменную, чтобы указать, что целевой поток должен* прекратить запуск. Целевой поток должен регулярно проверять эту переменную* и возвращать из своего метода запуска упорядоченным образом*, если переменная указывает, что она должна прекратить запуск. Если целевой поток* ждет длительные периоды (на переменной условия, например), метод <code> прерывания </code> должен использоваться для* прервать ожидание.*/
Общее значение заключается в том, что неуверенность метода присуща. Вызовов Stop () для завершения потока выпустит все мониторы, которые он заблокировал (это приведет к тому, что исключение ThreadDeath распространяется вверх по стеке, чтобы быть проверенным, чтобы быть брошенным). Если в объектах, ранее защищенных этими выпущенными мониторами, существует несоответствие, и эти объекты видны для других потоков, это приведет к некоторым неожиданным последствиям. Что должно остановить операции, чтобы быть заменен кодом, который должен изменить только определенный код, чтобы указать, что целевой поток должен прекратить работу (метод 1 - это способ). Если целевой поток ждет определенного условия (например, определенная переменная условия) в течение длительного времени, мы должны использовать метод прерывания для прерывания ожидания (это метод метода 3).
3. Используйте метод прерывания для прерывания потока.
Прерывание буквально означает прекращение, но не пытайтесь прекратить поток, вызывая прерывание, потому что иногда даже если вы называете метод, поток будет продолжать выполнять. Вы можете прокомментировать exitbyflag () выше, включить метод exitbyinterrupt () и обнаружить, что метод Enterrupt () вызывается во времени, и я работаю ... (результаты различных систем и процессоров могут быть разными). Видно, что небезопасно использовать метод прерывания.
Суммировать
Согласно вышеуказанному анализу, наиболее рекомендуемый метод является первым. Мы можем установить флаги, используя общие переменные и отправлять сигналы, чтобы сообщить потоку, что он должен завершить. Конечно, мы должны убедиться, что операции этой общей переменной являются синхронными.
Выше приведено все содержание этой статьи об экземпляре потока Java Delmination и чтении исходного кода STOP (). Я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!