русс | укр

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

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

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

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


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

CyclicBarrier


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


Класс CyclicBarrier используется при создании группы параллельно выполняемых задач, завершения которых необходимо дождаться до перехода к следующей фазе. Все параллельные задачи «приостанавливаются» у барьера, чтобы сделать возможным их согласованное продвижение вперед. Класс очень похож на CountDownLatch, за одним важным исключением: CountDownLatch является «одноразовым», a CyclicBarrier может использоваться снова и снова.

Имитации привлекали меня с первых дней работы с компьютерами, и параллельные вычисления играют в них ключевую роль. Даже самая первая программа, которую я написал на BASIC, имитировала скачки на ипподроме. Вот как выглядит объектно-ориентированная, многопоточная версия этой программы с использованием CyclicBarrier:

//: concurrency/HorseRace.java

// Using CyclicBarriers.

import java.util.concurrent.*;

import java.util.*;

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

 

class Horse implements Runnable {

private static int counter = 0;

private final int id = counter++;

private int strides = 0;

private static Random rand = new Random(47);

private static CyclicBarrier barrier;

public Horse(CyclicBarrier b) { barrier = b; }

public synchronized int getStrides() { return strides; }

public void run() {

try {

while(!Thread.interrupted()) {

synchronized(this) {

strides += rand.nextInt(3); // Produces 0, 1 or 2

}

barrier.await();

}

} catch(InterruptedException e) {

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

} catch(BrokenBarrierException e) {

// Исключение, которое нас интересует

throw new RuntimeException(e);

}

}

public String toString() { return "Horse " + id + " "; }

public String tracks() {

StringBuilder s = new StringBuilder();

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

s.append("*");



s.append(id);

return s.toString();

}

}

 

public class HorseRace {

static final int FINISH_LINE = 75;

private List<Horse> horses = new ArrayList<Horse>();

private ExecutorService exec =

Executors.newCachedThreadPool();

private CyclicBarrier barrier;

public HorseRace(int nHorses, final int pause) {

barrier = new CyclicBarrier(nHorses, new Runnable() {

public void run() {

StringBuilder s = new StringBuilder();

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

s.append("="); // Забор на беговой дорожке

print(s);

for(Horse horse : horses)

print(horse.tracks());

for(Horse horse : horses)

if(horse.getStrides() >= FINISH_LINE) {

print(horse + "won!");

exec.shutdownNow();

return;

}

try {

TimeUnit.MILLISECONDS.sleep(pause);

} catch(InterruptedException e) {

print("barrier-action sleep interrupted");

}

}

});

for(int i = 0; i < nHorses; i++) {

Horse horse = new Horse(barrier);

horses.add(horse);

exec.execute(horse);

}

}

public static void main(String[] args) {

int nHorses = 7;

int pause = 200;

if(args.length > 0) { // Необязательный аргумент

int n = new Integer(args[0]);

nHorses = n > 0 ? n : nHorses;

}

if(args.length > 1) { // Необязательный аргумент

int p = new Integer(args[1]);

pause = p > -1 ? p : pause;

}

new HorseRace(nHorses, pause);

}

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

Для объекта CyclicBarrier можно задать «барьерное действие» — объект Runnable, автоматически запускаемый при обнулении счетчика (еще одно отличие CyclicBarrier от CountdownLatch). В нашем примере барьерное действие опре­деляется в виде безымянного класса, передаваемого конструктору CyclicBarrier.

Я попытался сделать так, чтобы каждый объект лошади отображал себя, но порядок отображения зависел от диспетчера задач. Благодаря CyclicBarrier каждая лошадь делает то, что ей необходимо для продвижения вперед, а затем ожидает у барьера перемещения всех остальных лошадей. Когда все лошади переместятся, CyclicBarrier автоматически вызывает «барьерную» задачу Runnable, чтобы отобразить всех лошадей по порядку вместе с барьером. Как только все задачи пройдут барьер, последний автоматически становится готовым для следующего захода.



<== предыдущая лекция | следующая лекция ==>
CountDownLatch | DelayQueue


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


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

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

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


 


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

 
 

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

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