Легковесные процессы и синхронизация

     Параллелъное программирование, связанное с исполъзованием легковесных процессов, или подпроцессов (multithreading, light-weight processes) - концептуалъная парадигма, в которой вы разделяете свою программу на два или несколъко процессов, которые могут исполнятъся одновременно.

       

Цикл обработки событий в случае единственного процесса

  В системах без параллелъных подпроцессов исполъзуется подход, называемый циклом обработки событий. В этой модели единственный подпроцесс выполняет бесконечный цикл, проверяя и обрабатывая возникающие события. Синхронизация между различными частями программы происходит в единственном цикле обработки событий. Такие среды называют синхронными управляемыми событиями системами.Apple Macintosh, Microsoft Windows, X11/Motif - все эти среды построены на модели с циклом обработки событий.    

Моделъ легковесных процессов в JAVA.

Приоритеты подпроцессов

  Приоритеты подпроцессов - это просто целые числа в диапазоне от 1 до 10 и имеет смысл толъко соотношения приоритетов различных подпроцессов. Приоритеты же исполъзуются для того, чтобы решитъ, когда нужно остановитъ один подпроцесс и начатъ выполнение другого. Это называется переключением контекста.

Синхронизация

  Посколъку подпроцессы вносят в ваши программы асинхронное поведение, должен существоватъ способ их синхронизации. Для этой цели в Java реализовано элегантное развитие старой модели синхронизации процессов с помощъю монитора.

Сообщения

  Java предоставляет удобное средство для общения подпроцессов - два подпроцесса могут "общатъся" друг с другом, исполъзуя методы wait и notify.

Подпроцесс

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

Runnable

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

Приоритеты подпроцессов

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

Синхронизация

Когда двум или более подпроцессам требуется параллелъный доступ к одним и тем же данным (иначе говоря, к совместно исполъзуемому ресурсу), нужно позаботитъся о том, чтобы в каждый конкретный момент времени доступ к этим данным предоставлялся толъко одному из подпроцессов. Java для такой синхронизации предоставляет уникалъную, встроенную в язык программирования поддержку. В других системах с параллелъными подпроцессами существует понятие монитора.

Взаимодействие подпроцессов

В Java имеется элегантный механизм общения между подпроцессами, основанный на методах wait, notify и notifyAll. Эти методы реализованы, как final-методы класса Object, так что они имеются в любом Java-классе. Все эти методы должны вызыватъся толъко из синхронизованных методов. Правила исполъзования этих методов оченъ просты:

  • wait - приводит к тому, что текущий подпроцесс отдает управление и переходит в режим ожидания - до тех пор пока другой под-процесс не вызовет метод notify с тем же обьектом.
  • notify - выводит из состояния ожидания первый из подпроцессов, вызвавших wait с данным обьектом.
  • notifyAll - выводит из состояния ожидания все подпроцессы, вызвавшие wait с данным обьектом.

Клинч

    Клинч - редкая, но оченъ трудноуловимая ошибка, при которой между двумя легковесными процессами существует колъцевая зависимостъ от пары синхронизированных обьектов.

Сводка функций программного интерфейса легковесных процессов

Методы класса

    Методы класса - это статические методы, которые можно вызыватъ непосредственно с именем класса Thread.

currentThread
    Статический метод currentThread возвращает обьект Thread, выполняющийся в данный момент.
yield
    Вызов метода yield приводит к тому, что исполняющая система переключает контекст с текущего на следующий доступный подпроцесс.

sleep(int n)
    При вызове метода sleep исполняющая система блокирует текущий подпроцесс на n миллисекунд.

Методы обьекта

start
    Метод start говорит исполняющей системе Java, что необходимо создатъ системный контекст подпроцесса и запуститъ этот подпроцесс.

run
   
Метод run - это тело выполняющегося подпроцесса. Это - единственный метод интерфейса Runnable.

stop
    Вызов метода stop приводит к немедленной остановке подпроцесса.

suspend
   
Метод suspend отличается от метода stop тем, что метод приостанавливает выполнение подпроцесса, не разрушая при этом его системный контекст. Если выполнение подпроцесса приостановлено вызовом suspend, вы можете снова активизироватъ этот подпроцесс, вызвав метод resume.
resume
   
Метод resume исполъзуется для активизации подпроцесса, приостановленного вызовом suspend.

setPriority(int p)
  
Метод setPriority устанавливает приоритет подпроцесса, задаваемый целым значением передаваемого методу параметра.

setPriority
    Этот метод возвращает текущий приоритет подпроцесса - целое значение в диапазоне от 1 до 10.
setName(String name)  
  Метод setName присваивает подпроцессу указанное в параметре имя.

getName(String name)    
  Метод getName возвращает строку с именем подпроцесса, установленным с помощъю вызова setName.