Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
develop:java:in [2023/01/18 16:33] admin [Исключения, утверждения и протоколирование] |
develop:java:in [2023/05/03 15:18] (текущий) admin |
||
---|---|---|---|
Строка 348: | Строка 348: | ||
</ | </ | ||
+ | < | ||
+ | < | ||
+ | Используются скорее для самопроверки, | ||
+ | </ | ||
+ | < | ||
+ | < | ||
+ | В подсистеме протоколирования используются **регистраторы** (logger) и **обработчики** (hendler). Каждый из них имеет уровень, | ||
+ | Некоторые моменты: | ||
+ | * Все протокольные записи нетрудно разрешить или запретить | ||
+ | * Протокольные записи можно направить разным обработчикам | ||
+ | * Регистраторы и обработчики способны фильтровать записи | ||
+ | * Применяются файлы конфигурации | ||
+ | **Обработчики**\\ | ||
+ | Для протоколирования есть отдельные конфиги, | ||
+ | <code java> | ||
+ | Logger logger = Logger.getLogger(" | ||
+ | logger.setLevel(level.FINE); | ||
+ | logger.setUseParentHandlers(false); | ||
+ | var handler = new ConsoleHandler(); | ||
+ | handler.setLevel(Level.FINE); | ||
+ | logger.addHandler(handler); | ||
+ | </ | ||
+ | По умолчанию регистратор отправляет события своему и всем родительским обработчикам, | ||
+ | **Фильтры**\\ | ||
+ | Помимо стандартных уровней, | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ==== Параллелизм ==== | ||
+ | Два основных инструмента для распараллеливания выполнения это процессы и потоки\\ | ||
+ | Главное отличие многопроцессность от многопоточности в том что в первом случае у каждого процесса свой набор переменных, | ||
+ | Так же, потоки обычно даются более дешево чем процессы\\ | ||
< | < | ||
- | < | + | < |
+ | Для выполнения кода в отдельном потоке, | ||
<code java> | <code java> | ||
+ | // Так же можно использовать лямбда-выражения\\ | ||
+ | Runnable r = () -> {код задачи}; | ||
+ | var t = new Thread(r); | ||
+ | t.start(); | ||
+ | </ | ||
+ | При прямом вызове метода **run()** код будет выполнен в том же потоке, | ||
+ | </ | ||
+ | |||
+ | |||
+ | < | ||
+ | < | ||
+ | **Новый**\\ | ||
+ | Создан операцией **new**, но еще не запущен на исполнение\\ | ||
+ | |||
+ | **Исполняемый**\\ | ||
+ | В любой момент времени поток может выполняться или не выполняться ОС, для второго состояния нет отдельной категории в Java, конкретными моментами выполнения занимается уже ОС и планировщик выполнения. В целом этот статус означает работу потока\\ | ||
+ | |||
+ | **Блокированный**, | ||
+ | Когда поток пытается получить блокировку объектов которая в настоящий момент захвачена другим потоком, | ||
+ | Ожидающий он тогда когда ждет уведомления о каком либо событии (на практике мало отличается от блокировки). Ну а временно ожидающий, | ||
+ | |||
+ | **Завершенный**\\ | ||
+ | Завершится поток может нормальным способом когда выполнился весь код в методе **run()**, либо внезапно, | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | < | ||
+ | **Прерывание**\\ | ||
+ | Приемлемых способов принудительно завершить поток из вне нет. Для запроса на прерывание можно вызвать метод **interrup()**, | ||
+ | Для этого нужно в потоке либо проверять состояние, | ||
+ | |||
+ | **Демон**\\ | ||
+ | Поток у которого нет других целей кроме как служить другим потокам. " | ||
+ | |||
+ | **Именование**\\ | ||
+ | Можно задать имя потоку, | ||
+ | |||
+ | **Обработка не обрабатываемых исключений**\\ | ||
+ | сам поток не может генерировать никакие исключения наружу, | ||
+ | |||
+ | **Приоритеты**\\ | ||
+ | **setPriority()**, | ||
+ | |||
+ | |||
+ | **Синхронизация потоков**\\ | ||
+ | Проблема в общих ресурсах возникает тогда, когда обращение к ним происходит одновременно, | ||
+ | |||
+ | **Блокировка**\\ | ||
+ | Есть по сути аналог критической секции. Класс **ReentrantLock**\\ | ||
+ | <code java> | ||
+ | private Lock myLock = new ReentrantLock(); | ||
+ | myLock.lock(); | ||
+ | try: | ||
+ | { | ||
+ | критический раздел кода | ||
+ | } | ||
+ | finally | ||
+ | { | ||
+ | myLock.unlock(); | ||
+ | } | ||
</ | </ | ||
+ | Есть еще объекты блокировки с условиями\\ | ||
</ | </ | ||
+ | |||
+ | |||
+ | ==== Коллекции данных ==== | ||
+ | === Разделение интерфейсов и реализаций === | ||
+ | Собсна такое разделение является стандартом и дает множество преимуществ\\ | ||
+ | < | ||
+ | < | ||
+ | Самая простая форма интерфейса может выглядеть так: | ||
+ | <code java> | ||
+ | interface Queue< | ||
+ | { | ||
+ | void add(E e lement); | ||
+ | Е remove(); | ||
+ | int size(); | ||
+ | } | ||
+ | </ | ||
+ | А реализация с-но может сильно варьироваться и определяется классом, | ||
+ | <code java> | ||
+ | class CircularArrayQueue< | ||
+ | { | ||
+ | CircularArrayQueue(int capacity) | ||
+ | public void add(E element) | ||
+ | public Е remove () | ||
+ | public int size () | ||
+ | private Е[] elements; | ||
+ | private int head; | ||
+ | private int tail; | ||
+ | } | ||
+ | // или | ||
+ | class LinkedListQueue< | ||
+ | { | ||
+ | LinkedListQueue () | ||
+ | void add (Е element) | ||
+ | public Е remove () | ||
+ | public int size() | ||
+ | private Link head; | ||
+ | private Link tail; | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | < | ||
+ | Основополагающий для классов коллекций | ||
+ | <code java> | ||
+ | public interface Collection< | ||
+ | { | ||
+ | boolean add(E element); | ||
+ | Iterator< | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | < | ||
+ | < | ||
+ | <code java> | ||
+ | public interface Iterator< | ||
+ | { | ||
+ | E next(); | ||
+ | boolean hasNext(); | ||
+ | void remove(); | ||
+ | } | ||
+ | </ | ||
+ | Нужно проверять наличие через " | ||
+ | Порядок в котором перебираются элементы, | ||
+ | Итераторы в java отличаются от сишных, | ||
+ | Тобишь для каких либо д-й с итератором, | ||
+ | </ | ||
+ | |||
+ | |||
+ | === Коллекции в Java === | ||
+ | < | ||
+ | < | ||
+ | {{: | ||
+ | |||
+ | **Связные списки**\\ | ||
+ | Двунаправленные элементы, | ||
+ | {{: | ||
+ | |||
+ | **Списочные массивы**\\ | ||
+ | Интерфейс List описывает упорядоченную коллекцию, | ||
+ | К слову, отличие **Vector** и **ArrayList** в том что первый потокобезопасный, | ||
+ | |||
+ | **Хеш-множества**\\ | ||
+ | Более эффективный поиск элементов в списке\\ | ||
+ | Из-за специфики реализации, | ||
+ | |||
+ | **Древовидные множества**\\ | ||
+ | Основным отличием является то что все элементы в нем всегда отсортированы, | ||
+ | Работает немного медленнее чем хеш, но многое зависит от типа данных, | ||
+ | |||
+ | **Одно- и двустроние очереди**\\ | ||
+ | Впринципе рассмотрено уже\\ | ||
+ | Так же существуют очереди **по приоритету**\\ | ||
+ | </ | ||
+ | |||