Как остановить поток?
На данный момент в
Для корректной остановки потока можно использовать метод класса
Схема действия при этом получается следующей:
• Реализовать поток.
• В потоке периодически проводить проверку статуса прерывания через вызов
• Если состояние флага изменилось или было выброшено исключение во время ожидания/спячки, следовательно поток пытаются остановить извне.
• Принять решение – продолжить работу (если по каким-то причинам остановиться невозможно) или освободить заблокированные потоком ресурсы и закончить выполнение.
Возможная проблема, которая присутствует в этом подходе – блокировки на потоковом вводе-выводе. Если поток заблокирован на чтении данных - вызов
Второй вариант реализации метода остановки (а также и приостановки) – сделать собственный аналог
На данный момент в
Java принят уведомительный порядок остановки потока (хотя JDK 1.0 и имеет несколько управляющих выполнением потока методов, например stop(), suspend() и resume() - в следующих версиях JDK все они были помечены как deprecated из-за потенциальных угроз взаимной блокировки).Для корректной остановки потока можно использовать метод класса
Thread - interrupt(). Этот метод выставляет некоторый внутренний флаг-статус прерывания. В дальнейшем состояние этого флага можно проверить с помощью метода isInterrupted() или Thread.interrupted() (для текущего потока). Метод interrupt() также способен вывести поток из состояния ожидания или спячки. Т.е. если у потока были вызваны методы sleep() или wait() – текущее состояние прервется и будет выброшено исключение InterruptedException. Флаг в этом случае не выставляется.Схема действия при этом получается следующей:
• Реализовать поток.
• В потоке периодически проводить проверку статуса прерывания через вызов
isInterrupted().• Если состояние флага изменилось или было выброшено исключение во время ожидания/спячки, следовательно поток пытаются остановить извне.
• Принять решение – продолжить работу (если по каким-то причинам остановиться невозможно) или освободить заблокированные потоком ресурсы и закончить выполнение.
Возможная проблема, которая присутствует в этом подходе – блокировки на потоковом вводе-выводе. Если поток заблокирован на чтении данных - вызов
interrupt() из этого состояния его не выведет. Решения тут различаются в зависимости от типа источника данных. Если чтение идет из файла – долговременная блокировка крайне маловероятна и тогда можно просто дождаться выхода из метода read(). Если же чтение каким-то образом связано с сетью – стоит использовать неблокирующий ввод-вывод из Java NIO.Второй вариант реализации метода остановки (а также и приостановки) – сделать собственный аналог
interrupt(). Т.е. объявить в классе потока флаги – на остановку и/или приостановку и выставлять их путем вызова заранее определённых методов извне. Методика действия при этом остаётся прежней – проверять установку флагов и принимать решения при их изменении. Недостатки такого подхода. Во-первых, потоки в состоянии ожидания таким способом не «оживить». Во-вторых, выставление флага одним потоком совсем не означает, что второй поток тут же его увидит. Для увеличения производительности виртуальная машина использует кеш данных потока, в результате чего обновление переменной у второго потока может произойти через неопределенный промежуток времени (хотя допустимым решением будет объявить переменную-флаг как volatile).👍17
Три задачи на знание Java от ChatGPT
Попросили языковую модель ChatGPT составить три задачи на знание Java: простую, среднюю и сложную.
Смотреть статью
Попросили языковую модель ChatGPT составить три задачи на знание Java: простую, среднюю и сложную.
Смотреть статью
Tproger
Три задачи на знание Java от ChatGPT / Tproger
Языковая модель ChatGPT составила простую, среднюю и сложную задачи по Java. Сможете ли вы решить все три задачи?
👍11
#Вопросы_с_собеседования
🎙️ Чем занимается сборка мусора в Java?
Сборка мусора Java — это метод, с помощью которого приложения Java автоматически сохраняют свою память, удаляя или очищая неиспользуемые объекты и пакеты в памяти.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍24🔥1😱1
Пишем свой первый сервер на Java и Spring Boot
В этой статье мы поговорим о разработке и архитектуре современных web-приложений и разработаем серверную часть простого приложения, добавляющего пользователей и их посты, приложение же напишем на самом распространённом и востребованном Java-фреймворке – Spring Boot.
Смотреть статью
В этой статье мы поговорим о разработке и архитектуре современных web-приложений и разработаем серверную часть простого приложения, добавляющего пользователей и их посты, приложение же напишем на самом распространённом и востребованном Java-фреймворке – Spring Boot.
Смотреть статью
Библиотека программиста
☕ Пишем свой первый сервер на Java и Spring Boot
В этой статье мы поговорим о разработке и архитектуре современных web-приложений и разработаем серверную часть простого приложения, добавляющего пользователей и их посты. Приложение напишем на самом распространённом и востребованном Java-фреймворке – Spring…
👍16🔥4😱1
#Вопросы_с_собеседования
🎙️ Каковы различия между подклассом и внутренним классом?
Ответ на картинке.
Ответ на картинке.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16❤1
#Вопросы_с_собеседования
🎙️ Какие есть типы данных в Java?
В Java существует 8 типов данных:
1. short
2. byte
3. char
4. int
5. float
6. double
7. long
8. boolean
В Java существует 8 типов данных:
2. byte
3. char
4. int
5. float
6. double
7. long
8. boolean
Please open Telegram to view this post
VIEW IN TELEGRAM
👍33🤔2😢1
#Вопросы_с_собеседования
🎙️ Что такое исключение? Какой пакет содержит все определения классов исключений в Java?
Исключения (Exceptions) — это нештатные ситуации, возникающие во время выполнения программы. Они могут произойти в результате неправильного ввода пользователем или неправильной логики кодера. Пакет java.lang.Exception содержит все определения классов исключений в Java.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍27🤔2
Какой результат выведет следующая программа?
Anonymous Quiz
10%
Программа уйдет в бесконечный цикл
8%
Hello
49%
Программа не скомпилируется
34%
Hello world
👍32🤔1
#Вопросы_с_собеседования
🎙️ Выполнится ли блок finally, если блок try или catch выполняют инструкцию return?
Да, блок finally выполнится, даже если return выполнился в блоке try или catch. Это один из самых популярных и сложных вопросов по Java. Запомните: единственный способ остановить выполнение блока finally — использовать System.exit().
Please open Telegram to view this post
VIEW IN TELEGRAM
👍64😱8🔥4
Нужно ли использовать лямбды для оптимизации кода, либо они предназначены только для улучшения читаемости?
Anonymous Quiz
34%
Только улучшение читаемости
40%
Лучше использовать всегда, т. к. происходит оптимизация
25%
Есть смысл использовать только в циклах заместо анонимных классов
👍19🤔11❤1😢1
Что будет выведено на экран?
Anonymous Quiz
15%
falsetrue
7%
truefalse
36%
Compiler Error
27%
truetrue
14%
falsefalse
👍23😢9🔥1
Какое из следующих утверждений о потоках неверно?
1. Если метод
2. Порядок, в котором запускались потоки, может не совпадать с порядком их фактического выполнения.
3. Если метод
4. Если метод
Правильный ответ: 3. Если метод вызывается напрямую для объекта , во время выполнения исключение не генерируется. Однако, код, написанный в методе будет выполняться текущим, а не новым потоком. Таким образом, правильный способ запустить поток – это вызов метода , который приводит к выполнению метода новым потоком.
Вызов метода дважды для одного и того же объекта приведёт к генерированию исключения во время выполнения, следовательно, утверждение 1 верно. Утверждение 2 верно, так как порядок, в котором выполняются потоки, определяется Планировщиком потоков, независимо от того, какой поток запущен первым. Утверждение 4 верно, так как поток не освободит блокировки, которые он держит, когда он переходит в состояние Ожидания.
1. Если метод
start() вызывается дважды для одного и того же объекта Thread, во время выполнения генерируется исключение.2. Порядок, в котором запускались потоки, может не совпадать с порядком их фактического выполнения.
3. Если метод
run() вызывается напрямую для объекта Thread, во время выполнения генерируется исключение.4. Если метод
sleep() вызывается для потока, во время выполнения синхронизированного кода, блокировка не снимается.run() Threadrun() start()run() Вызов метода
start() Thread IllegalThreadStateException 👍20🔥7