Функция состояния состоит в том, чтобы обеспечить более точный контроль за блокировкой. Метод wait () в условии эквивалентен методу wait () объекта, метод сигнала () в условии эквивалентен методу notify () объекта, а сигнальный () в условии эквивалентен методу notifyall () объекта. Разница в том, что методы wait (), notify () и notifyall () в объекте связаны с «синхронизированным блокировкой» (синхронизированное ключевое слово); и условие должно быть связано с "Mutex"/"Share Lock".
Список функций состояния
// приводит к тому, что текущий поток ждал, пока он не получит сигнал или не будет прерван. void wait () // Приводит к тому, что текущий поток остается в состоянии ожидания перед получением сигнала, прерывается или достигает указанного времени ожидания. Boolean ожидает (долгое время, единица времени Unit) // Приводит к тому, что текущий поток находится в состоянии ожидания до тех пор, пока он не получит сигнал, не будет прерывается или не достигнет указанного времени ожидания. Long Awaitnanos (Long Nanostimeout) // Приводит к тому, что текущий поток находится в состоянии ожидания перед получением сигнала. void aaitUninterbultable () // Приводит к тому, что текущий поток остается в состоянии ожидания до тех пор, пока он не получит сигнал, прерывается или достигнет указанного срока. Boolean Awaittunil (дата срока) // Разбудить резьбу для ожидания. void Signal () // Просыпайте все резьбы ожидания. void Signalall ()
Пример использования класса условий
Условие разбивает методы монитора объекта (подождите, уведомляйте и уведомляют) на совершенно разные объекты, чтобы, объединив эти объекты с любой реализацией блокировки, каждый объект предоставляет несколько наборов ожидания (набор ожидания). Среди них Lock заменяет использование синхронизированных методов и операторов, а условие заменяет использование методов монитора объектов. Ниже приведен ранее написанный пример связи потока с реализацией с условием, код заключается в следующем:
public Class ThreadTest2 {public static void main (string [] args) {final Business Business = new Business (); Новый поток (new Runnable () {@Override public void run () {thinkExecute (business, "sub");}}). start (); ThreadExecute (Business, "Main"); } public static void ThreadeExecute (Business Business, String Threadtype) {for (int i = 0; i <100; i ++) {try {if ("main" .equals (threadtype)) {business.main (i); } else {business.sub (i); }} catch (прерывание Exception e) {e.printStackTrace (); }}}} класс бизнес {private boolean bool = true; Private Lock Lock = new Reentrantlock (); Условие частного условия = lock.newCondition (); public /*synchronized* / void main (int loop) бросает прерванные эктриэкцепции {lock.lock (); try {while (bool) {condity.await (); // this.wait (); } for (int i = 0; i <100; i ++) {System.out.println ("Основной поток SEQ" + i + ", цикл" + loop); } bool = true; condition.signal (); // this.notify (); } наконец {lock.unlock (); }} public /*synchronized* / void sub (int loop) бросает прерывания {lock.lock (); try {while (! bool) {condity.await (); // this.wait (); } for (int i = 0; i <10; i ++) {System.out.println ("Sub -Tread Seq of" + i + ", цикл" + loop); } bool = false; condition.signal (); // this.notify (); } наконец {lock.unlock (); }}} В условиях замените wat () на wait (), замените notify () на сигнал () и замените notifyall () на Signalall (). Традиционный метод связи может быть реализован. Обратите внимание здесь, это условие связано с блокировкой. Чтобы создать блокировку, вы должны использовать метод NewCondition ().
Таким образом, состояние ничем не отличается от традиционной связи. Сила состояния заключается в том, что он может устанавливать различные условия между несколькими потоками. Ниже приведен кусок кода из API, чтобы проиллюстрировать.
Класс BroundedBuffer {final Lock Lock = new ReentRantLock (); // Lock Object Final Condity natfull = lock.newCondition (); // Записать условие потока Конечное условие notempty = lock.newCondition (); // Условие потока в очереди*/; public void put (объект x) бросает прерванную экзантику {lock.lock (); Попробуйте {while (count == item.length) // Если очередь полна natufull.await (); // block пункты записи [putptr] = x; // назначить, если (++ putptr == elects.length) putptr = 0; // Если индекс записи записывается в последнюю позицию в Queue, установите его на 0 ++; Thread} наконец {lock.unlock (); }} public Object take () Throws urruptEdException {lock.lock (); Попробуйте {while (count == 0) // Если очередь пуст notempty.await (); // заблокировать объект считывания потока x = elects [takeptr]; // Выберите значение, если (++ tableptr == elects.length) tableptr = 0; // Если индекс чтения читает последнюю позицию в Queue, установите его на 0 --count; // umed ubrint. x; } наконец {lock.unlock (); }}} Это кеш-область в многопоточной рабочей среде. Область кеша предоставляет два метода: положить и взять. PUT IS для хранения данных, Take Is - для получения данных, а внутри есть очередь кэша. См. Код для конкретных переменных и описаний методов. Функции, реализованные этим классом области кэша: несколько потоков хранят данные и извлекают из него данные. Максимальное значение кэша, которое очередь кэша (сначала, сначала, затем в, а затем и Out) может кэш составляет 100. Многочисленные потоки являются взаимоисключающими. Когда значение, хранящееся в очереди кэша, достигнет 100, поток записи будет заблокирован, а поток чтения будет пробужден. Когда значение, хранящееся в очереди кэша, составляет 0, поток чтения будет заблокирован, а поток записи будет пробужден. Следующий анализ процесса выполнения кода:
1. Поток записи выполняет и вызывает метод PUT;
2. Чтобы определить, составляет ли число 100, очевидно, нет 100;
3. Продолжайте выполнять и депонировать значение;
4. После определения в настоящее время написанного индекса позиции ++, будь то 100. Выравнивать значение индекса записи до 0 и count+1;
5. Разбудите только одну из очередей для блокировки чтения;
6. Выполните поток чтения и вызовите метод Take;
7.…
8. Разбуди только одну из очередей блокировки записи.
Это сила множества условий. Предполагая, что очередь кэша заполнена, то блокировка определенно является потоком записи, а пробуждение определенно является поток чтения. Напротив, блокировка, безусловно, является веткой чтения, а пробуждение, безусловно, является потоком записи. Так что же произойдет, если есть только одно условие? Очередь кэша заполнена, эта блокировка не знает, является ли это потоком чтения или потоком. Если пробуждение является веткой чтения, все счастливы. Если пробуждение является потоком записи, то поток только что разбудился и снова заблокирован, а затем снова просыпается, что тратит много времени.