Читайте также:
|
|
Состояния потоков:
- Born (Порождён): Вновь созданный поток находится в состоянии born (порождён).
- Ready (Готов): После создания потока он переходит в состояние ready (готов), ожидая вызова метода start ().
- Running (Работает): Поток входит в рабочее состояние, когда начинается его выполнение
- Sleeping (Пауза): Выполнение потока может быть временно приостановлено с помощью метода sleep (). Поток опять переходит в состояние готовности после окончания интервала времени паузы.
- Waiting (Ожидание): Поток находится в состоянии ожидания, если был вызван метод wait (). Используется при параллельной работе двух и более потоков.
Blocked (Заблокирован): Поток входит в состояние блокировки, когда ожидает наступления некоторого события, например, выполнение операций ввода/вывода.
Dead (Уничтожен): Для потока состояние dead наступает после завершения работы метода run () или после вызова метода stop () в потоке.
Приоритеты потоков в Java являются константами, определёнными в классе Thread.
NORM_PRIORITY – значение 5
MAX_PRIORITY – значение 10
MIN_PRIORITY – значение 1
Приоритетом по умолчанию является NORM_PRIORITY
Два метода используются для изменения приоритета:
final void setPriority(int newp): изменяет текущий приоритет потока.
final int getPriority(): возвращает приоритет потока.
35. Что такое Daemon-потоки?
Два типа потоков в Java:
- Пользовательские потоки: создаются пользователем
- Daemon-потоки: потоки, которые работают в фоновом режиме, обеспечивая сервис для других потоков, например – поток «сборки мусора» (garbage collector)
При выходе из пользовательского потока виртуальная машина JVM выполняет проверку, чтобы определить, не выполняется ли какой-либо другой поток.
Если выполняющийся поток обнаружен, то начинается планирование выполнения следующего потока.
Если выполняются только daemon-потоки, то происходит выход.
Мы можем сделать поток Daemon-потоком, если нет необходимости в том, чтобы основная программа ожидала окончания работы потока.
Класс Thread имеет два метода для работы с Daemon-потоками:
- public final void setDaemon(boolean value): выполняет установку потока, как daemon-потока
- public final boolean isDaemon(): проверяет, является ли заданный поток daemon-потоком
36. Для чего нужна синхронизация? Как она обеспечивается в Java?
- Иногда два или более потоков могут одновременно попытаться получить доступ к одному и тому же ресурсу. Например, один поток пытается прочитать данные из файла, в то время как другой поток пытается изменить данные в том же самом файле
- В этом случае данные могут стать некорректными.
- Для гарантии того, что общедоступный ресурс используется только одним потоком в любой момент времени, мы используем синхронизацию – synchronization.
- Синхронизация основана на концепции монитора (monitor).
- Монитор (monitor) – это объект, который используется, как взаимно исключающая блокировка (mutually exclusive lock).
- Только один поток может войти в монитор.
- Когда один поток входит в монитор, это означает, что данный поток принял блокировку, и все прочие потоки должны ждать до тех пор, пока этот поток не выйдет из монитора.
- Для входа потока в монитор объекта программист обязательно должен вызвать метод, созданный с использованием ключевого слова synchronized.
- Владелец этого метода должен выйти из метода, чтобы передать управление кому-либо.
Состояние состязания
- Если пропустить ключевое слово synchronized в предыдущем примере, то все потоки смогут одновременно вызывать один и тот же метод, в одном и том же объекте.
- Эта ситуация известна под названием race condition (состояние состязания).
- Возникновение состояния состязания в программе возможно в следующих случаях:
Два или несколько потоков совместно используют данные
Они одновременно считывают и записывают эти данные
Синхронизированный блок
- Не всегда возможно достижение синхронизации путём создания synchronized методов внутри классов.
- Мы можем разместить все обращения к методам, определённых данным классом, внутри синхронизизированного (synchronized) блока.
- Синхронизизированный (synchronized) блок гарантирует, что метод может быть вызван только после того, как соответствующий поток успешно вошёл в монитор объекта.
Ключевое слово synchronized включают в метод run().
Использование механизма ‘wait-notify’
- Java предоставляет хорошо проработанный механизм обмена информацией между процессами, использующий методы wait (), notify () и notifyAll ().
- Эти методы реализованы, как final -методы в классе Object.
- wait (), notify () и notifyAll () могут быть вызваны только из синхронизированного (synchronized) метода.
- Метод wait () приказывает вызывающему потоку выйти из монитора и перейти в состояние sleep до тех пор, пока какой-либо другой поток не войдёт в монитор и не вызовет метод notify().
- Метод notify ()даёт команду активизации (wake up) предыдущему потоку, который ранее вызвал метод wait ().
- Метод notifyAll () даёт команду активизации (wake up) или оповещает все потоки, которые ранее вызвали метод wait ().
- После того, как все потоки выходят из состояния паузы (sleep mode), поток, имеющий наивысший приоритет, начинает выполняться первым.
wait ()
При использовании метода wait() необходимо помнить о следующем:
- Вызывающий поток освобождает процессор (CPU).
- Вызывающий поток отменяет блокировку.
- Вызывающий поток переходит в пул ожидающих потоков (waiting pool) монитора.
notify ()
При использовании метода notify() необходимо помнить о следующем:
- Один поток извлекается из пула ожидающих потоков (waiting pool) монитора и переходит в состояние готовности (ready state).
- Этот поток, который был оповещён, обязательно должен восстановить блокировку монитора, прежде чем он сможет продолжить выполнение, поскольку, находясь в состоянии паузы (sleep state), он утратил управление монитором.
37. Что такое сборка мусора, как работает этот механизм?
Сборка мусора – Garbage collection:
- Процесс, при котором ранее выделенная объектам память, которая больше не используется, может быть освобождена или восстановлена.
- Java автоматически освобождает память, которая больше не требуется.
- Таким образом, программистам вообще не надо беспокоиться об освобождении использованной памяти.
- Объект может быть подвергнут процедуре «сборки мусора» (garbage collection), если отсутствуют какие бы то ни было ссылки на него, или если ему было присвоено null-значение.
- Сборщик мусора (Garbage collector) работает, как отдельный независимый поток с низким приоритетом.
- Сборщик мусора может быть вызван через обращение к методу gc() данного экземпляра.
- При этом не гарантируется, что сборщик мусора начнёт работу сразу после вызова.
Использование метода finalize
- Java предоставляет способ, похожий на деструкторы языка C++, который можно использовать для полного освобождения ресурсов перед тем, как управление будет возвращено операционной системе.
- Метод finalize (), если он присутствует, будет выполнен до начала процедуры сборки мусора только один раз для конкретного объекта. Синтаксис этого метода:
Дата добавления: 2015-09-11; просмотров: 24 | Поможем написать вашу работу | Нарушение авторских прав |