русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

CountDownLatch


Дата добавления: 2015-06-12; просмотров: 1215; Нарушение авторских прав


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

Объекту CountDownLatch присваивается начальное значение счетчика, а все задачи, вызвавшие await() для этого объекта, блокируются до момента обнуления счетчика. Другие задачи могут уменьшать счетчик, вызывая метод countDown() для объекта (обычно это делается тогда, когда задача завершает свою работу). Класс CountDownLatch рассчитан на «одноразовое» применение; счетчик не может возвращаться к прежнему состоянию. Если вам нужна версия с возможностью сброса счетчика, воспользуйтесь классом CyclicBarrier.

Задачи, вызывающие countDown(), не блокируются на время вызова. Только вызов await() блокируется до момента обнуления счетчика.

Типичный способ применения — разделение задачи на n независимых подзадач и создание объекта CountDownLatch с начальным значением n. При завершении каждая подзадача вызывает countDown() для объекта синхронизации. Потоки, ожидающие решения общей задачи, блокируются вызовом await(). Описанная методика продемонстрирована в следующем примере:

//: concurrency/CountDownLatchDemo.java

import java.util.concurrent.*;

import java.util.*;

import static net.mindview.util.Print.*;

 

// Часть основной задачи.:

class TaskPortion implements Runnable {

private static int counter = 0;

private final int id = counter++;

private static Random rand = new Random(47);

private final CountDownLatch latch;

TaskPortion(CountDownLatch latch) {

this.latch = latch;

}

public void run() {

try {

doWork();

latch.countDown();

} catch(InterruptedException ex) {

// Приемлемый вариант выхода

}

}

public void doWork() throws InterruptedException {

TimeUnit.MILLISECONDS.sleep(rand.nextInt(2000));

print(this + "completed");



}

public String toString() {

return String.format("%1$-3d ", id);

}

}

 

// Ожидание по объекту CountDownLatch:

class WaitingTask implements Runnable {

private static int counter = 0;

private final int id = counter++;

private final CountDownLatch latch;

WaitingTask(CountDownLatch latch) {

this.latch = latch;

}

public void run() {

try {

latch.await();

print("Latch barrier passed for " + this);

} catch(InterruptedException ex) {

print(this + " interrupted");

}

}

public String toString() {

return String.format("WaitingTask %1$-3d ", id);

}

}

 

public class CountDownLatchDemo {

static final int SIZE = 100;

public static void main(String[] args) throws Exception {

ExecutorService exec = Executors.newCachedThreadPool();

// Все подзадачи совместно используют один объект CountDownLatch:

CountDownLatch latch = new CountDownLatch(SIZE);

for(int i = 0; i < 10; i++)

exec.execute(new WaitingTask(latch));

for(int i = 0; i < SIZE; i++)

exec.execute(new TaskPortion(latch));

print("Launched all tasks");

exec.shutdown(); // Выход по завершению всех задач

}

} /* (Execute to see output) *///:~

TaskPortion некоторое время ожидает, имитируя выполнение части задачи, а класс WaitingTask представляет некую часть системы, которая обязана дождаться завершения всех подзадач. Все задачи используют один и тот же объект CountDownLatch, определяемый вmain().



<== предыдущая лекция | следующая лекция ==>
Public synchronized | CyclicBarrier


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 2.525 сек.