Разница между сном и ожиданием в Java

Оглавление:

Разница между сном и ожиданием в Java
Разница между сном и ожиданием в Java

Видео: Разница между сном и ожиданием в Java

Видео: Разница между сном и ожиданием в Java
Видео: Java урок - 19.2.2 Многопоточность. Методы sleep, yield, join 2024, Декабрь
Anonim

Ключевая разница - сон и ожидание в Java

Сон и ожидание - это два метода, используемые для многопоточности в Java. Метод sleep принадлежит классу Thread, а метод ожидания - классу Object. Ключевое различие между спящим и ожидающим режимами в Java заключается в том, что спящий режим используется для приостановки выполнения текущего потока на указанное количество миллисекунд, в то время как метод ожидания используется для того, чтобы заставить текущий поток ожидать, пока другой поток не вызовет уведомление или метод notifyAll для объекта.

Поток - это наименьшая единица обработки в операционной системе. Это единый последовательный поток управления внутри программы. Нитки легкие. Многопоточность - это механизм одновременного запуска нескольких потоков. Языки программирования, такие как Java, поддерживают многопоточность. Многопоточность имеет преимущества, поскольку позволяет одновременно запускать несколько потоков, и потоки независимы друг от друга. В Java есть методы, которые можно использовать для многопоточности. Двое из них спят и ждут.

Что такое сон в Java?

В операционной системе запущено несколько процессов. Процесс – это выполняемая программа. Каждый процесс может иметь несколько потоков, и между этими потоками происходит переключение контекста. В Java существует два способа создания потока. То есть путем расширения класса потока или путем реализации интерфейса Runnable. Класс Thread имеет конструкторы и методы для создания и выполнения операций над потоком. Класс Thread расширяет класс Object и реализует интерфейс Runnable. Интерфейс Runnable должен быть реализован любым классом, экземпляры которого предназначены для выполнения потоком. Когда поток выполняется, код, который должен выполняться, записывается внутри метода запуска. Поток, который должен выполняться, выбирается планировщиком потоков. В одном процессе работает только один поток.

Поток проходит несколько этапов. После создания объекта класса Thread программист может вызвать метод запуска. Перед вызовом этого метода говорят, что поток находится в новом состоянии. Планировщик потоков выбирает поток для запуска. Если поток еще не выбран планировщиком потоков, но вызывается метод запуска, то поток находится в состоянии выполнения. После того, как планировщик потоков выбирает поток для выполнения, он переходит в состояние выполнения. Если поток активен, но в настоящее время не может быть запущен, то он находится в неработоспособном или заблокированном состоянии. После завершения метода run поток переходит в завершенное состояние. Это основные фазы жизненного цикла потока.

В классе потоков доступны различные методы для выполнения различных задач. Метод сна используется для приостановки метода на определенное время. Синтаксис метода сна: public void sleep (длинные миллисекунды) выдает InterruptedException. Это приводит к временной остановке выполняемого в данный момент потока на указанное количество миллисекунд. Если другой поток прерывает текущий поток, статус прерывания текущего потока сбрасывается, когда выдается это исключение.

Разница между сном и ожиданием в Java
Разница между сном и ожиданием в Java

Рисунок 01: Java-программа с методом сна

Согласно приведенной выше программе, метод run содержит код, который необходимо выполнить. В основной программе создаются два объекта ExampleThread1, и на них вызываются методы запуска. Это позволит запустить код внутри метода run. Одновременно выполняется только один поток. С Нитью.сон (1000); позволит первому потоку прервать выполнение на 1000 миллисекунд. Когда поток спит, планировщик потоков подключается к другому потоку.

Что такое ожидание в Java?

Несколько потоков могут получить доступ к общему ресурсу. Это может привести к неправильному выводу. Синхронизация потоков может использоваться для того, чтобы только один поток имел доступ к общему ресурсу. Предположим следующую ситуацию. Если есть два потока как t1 и t2, t1 начинает сохранять значения в текстовый файл с именем Text1.txt. Эти значения будут использоваться для некоторых других вычислений, когда t1 вернется. Если t2 запускается до возврата t1, t2 может изменить значения, сохраненные t1. Это может привести к тому, что t1 выдаст неправильный вывод. С помощью синхронизации, когда t1 начинает использовать файл Text1.txt, этот файл может быть заблокирован, поэтому он доступен только t1. t2 не может изменить его, пока t1 не снимет блокировку для доступа к этому текстовому файлу. Когда задача завершена, t1 может снять блокировку. Замок также известен как монитор.

Синхронизация потоков может быть достигнута за счет межпотокового взаимодействия. Критическая секция - это сегмент кода, который обращается к общим ресурсам. При межпотоковой связи поток приостанавливается в своей критической секции, и другому потоку разрешается войти в ту же критическую секцию для выполнения. Он реализован с помощью методов wait, notify и notifyAll. Они относятся к классу объектов. Метод ожидания позволяет текущему потоку снять блокировку и подождать, пока другой поток не вызовет для объекта метод notify или notifyAll. Метод уведомления используется для пробуждения одного потока, ожидающего блокировки. notifyAll пробуждает все потоки, ожидающие блокировки.

Разница между сном и ожиданием в Java_Рисунок 02
Разница между сном и ожиданием в Java_Рисунок 02

Рисунок 02: Класс калькулятора

Ключевая разница между сном и ожиданием в Java
Ключевая разница между сном и ожиданием в Java

Рисунок 03: Основной метод

Класс Calculator расширяет класс Thread. Синхронизированный блок находится внутри метода запуска. Цикл for и метод уведомления находятся внутри блока synchronized. Внутри основного метода создается экземпляр потока, и для этого экземпляра вызывается метод запуска. Основной метод будет ждать, пока поток не отправит уведомление. При выполнении программы основной метод ожидает полного выполнения метода запуска и ждет метода уведомления. После вызова метода уведомления основной метод перестает ждать и начинает выполнение остальной части кода. Main ожидает завершения потока калькулятора. Наконец, выводится результат суммы.

Если нет синхронизированного блока и если основной метод имеет код, как показано ниже, он выдаст нулевой вывод, потому что он не ожидает завершения другого потока.

Калькулятор t1=новый калькулятор ();

t1. начать ();

System.out.println (t1.sum);

В чем сходство сна и ожидания в Java?

И режим сна, и ожидание - это методы, которые можно использовать при реализации многопоточности в Java

В чем разница между сном и ожиданием в Java?

сон или ожидание в Java

Метод sleep заставляет текущий поток приостанавливать выполнение на указанное количество миллисекунд, в зависимости от точности системных таймеров и планировщиков. Метод ожидания заставляет текущий поток ожидать, пока другой поток не вызовет метод notify или notifyAll для объекта.
Связь с Lock
Метод сна не снимает блокировку объекта во время синхронизации. Метод ожидания снимает блокировку во время синхронизации.
Способ исполнения
Метод сна выполняется в текущем потоке. Для объекта вызывается метод ожидания.
Ассоциированный класс
Сон - это метод класса Thread. Ожидание - это метод класса Object.
Завершение
Процесс сна завершается по истечении указанного времени. Метод ожидания прерывается вызовом методов notify или notifyAll.

Резюме – сон против ожидания в Java

В операционной системе запущено несколько процессов. Каждый процесс может иметь несколько потоков. Поток - это наименьшая единица обработки в операционной системе. Язык программирования Java поддерживает многопоточность. Это позволяет запускать несколько потоков одновременно. Сон и ожидание - это два метода, которые можно использовать при реализации многопоточности. Разница между режимом сна и ожиданием в Java заключается в том, что режим сна используется для приостановки выполнения текущего потока на указанное количество миллисекунд, в то время как метод ожидания используется для того, чтобы заставить текущий поток ожидать, пока другой поток не вызовет уведомление или уведомление. метод для объекта.

Рекомендуемые: