Java Learning
18.8K subscribers
1.62K photos
1 video
3 files
994 links
№ 5079899194

Обучающий канал по Java

Ссылка для друга - https://t.iss.one/+ZEYYht6-46w5MDM6

По всем вопросам @mascarov_valentin

Реклама на бирже - https://telega.in/c/Java_per_month
Download Telegram
Как остановить поток?

На данный момент в 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
Задача

Пользователь вводит три слова, программа сортирует их в алфавитном порядке

Пример:
Пользователь вводит слова:
папа
сын
мама

Программа выводит:
мама
папа
сын.
👍191😢1
Три задачи на знание Java от ChatGPT

Попросили языковую модель ChatGPT составить три задачи на знание Java: простую, среднюю и сложную.

Смотреть статью
👍11
#Вопросы_с_собеседования

🎙️ Чем занимается сборка мусора в Java?

Сборка мусора Java — это метод, с помощью которого приложения Java автоматически сохраняют свою память, удаляя или очищая неиспользуемые объекты и пакеты в памяти.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍24🔥1😱1
#Вопросы_с_собеседования

🎙️Назовите различные типы загрузчиков классов в Java

Ответ на картинке.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18
Пишем свой первый сервер на Java и Spring Boot

В этой статье мы поговорим о разработке и архитектуре современных web-приложений и разработаем серверную часть простого приложения, добавляющего пользователей и их посты, приложение же напишем на самом распространённом и востребованном Java-фреймворке – Spring Boot.

Смотреть статью
👍16🔥4😱1
#Вопросы_с_собеседования

🎙️ Каковы различия между подклассом и внутренним классом?

Ответ на картинке.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍161
#Вопросы_с_собеседования

Как одной строчкой преобразовать ArrayList в HashSet?

Ответ на картинке.
👍28
#Вопросы_с_собеседования

🎙️ Какие есть типы данных в Java?

В Java существует 8 типов данных:
1. short
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
🤔2👍1
👍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
Collection только для чтения

В Java есть полезные методы, позволяющие сделать класс Collection доступным только для чтения.

Мы можем сделать коллекцию только для чтения, используя один из следующих методов.
👍18
Метод rotate()

Метод java.util.Collections.rotate() присутствует в классе java.util.Collections. Используется для поворота элементов, присутствующих в указанном списке Коллекции, на заданное расстояние.
👍23🤔4😢1
Нужно ли использовать лямбды для оптимизации кода, либо они предназначены только для улучшения читаемости?
Anonymous Quiz
34%
Только улучшение читаемости
40%
Лучше использовать всегда, т. к. происходит оптимизация
25%
Есть смысл использовать только в циклах заместо анонимных классов
👍19🤔111😢1
Регулярное выражение для электронной почты

Регулярные выражения представляют собой формальный язык поиска и редактирования подстрок в тексте. К примеру, надо провалидировать email адрес. Это будет проверка на наличие имени адреса, домена, символа @, точки и доменной зоны.
👍31😢1
👍4🔥2
Что будет выведено на экран?
Anonymous Quiz
15%
falsetrue
7%
truefalse
36%
Compiler Error
27%
truetrue
14%
falsefalse
👍23😢9🔥1
Какое из следующих утверждений о потоках неверно?

1. Если метод start() вызывается дважды для одного и того же объекта Thread, во время выполнения генерируется исключение.
2. Порядок, в котором запускались потоки, может не совпадать с порядком их фактического выполнения.
3. Если метод run() вызывается напрямую для объекта Thread, во время выполнения генерируется исключение.
4. Если метод sleep() вызывается для потока, во время выполнения синхронизированного кода, блокировка не снимается.

Правильный ответ: 3. Если метод run() вызывается напрямую для объекта Thread, во время выполнения исключение не генерируется. Однако, код, написанный в методе run() будет выполняться текущим, а не новым потоком. Таким образом, правильный способ запустить поток – это вызов метода start(), который приводит к выполнению метода run() новым потоком.

Вызов метода
start() дважды для одного и того же объекта Thread приведёт к генерированию исключения IllegalThreadStateException во время выполнения, следовательно, утверждение 1 верно. Утверждение 2 верно, так как порядок, в котором выполняются потоки, определяется Планировщиком потоков, независимо от того, какой поток запущен первым. Утверждение 4 верно, так как поток не освободит блокировки, которые он держит, когда он переходит в состояние Ожидания.
👍20🔥7