Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
39
Добавлен:
27.03.2015
Размер:
271.87 Кб
Скачать

java.util.concurrent

Синхронизаторы. Барьеры (2)

Методы класса java.util.concurrent.CyclicBarrier:

int

await( )

Ожидание, пока заданное в конструкторе количество потоков

 

 

выполнит вызов этого метода.

int

await( long timeout,

Ожидание, пока заданное в конструкторе количество потоков

 

TimeUnit unit )

выполнит вызов этого метода или пока не закончится заданный

 

 

тайм-аут.

int

getNumberWaiting( )

Возвращает количество ожидающих потоков.

int

getParties( )

Возвращает количество потоков, требуемых для преодоления

 

 

этого барьера (установленное при создании экземпляра).

boolean

isBroken( )

Возвращает true, если хотя бы один поток прерван или ушел из

 

 

ожидания по тайм-ауту.

void

reset( )

Сброс барьера в исходное состояние.

Нужно отметить, что в момент срабатывания барьера экземпляр класса восстанавливает начальное состояние и может отрабатывать следующие parties срабатываний потоков.

java.util.concurrent Синхронизаторы.

Барьеры (3)

В этой программе параллельно вычисляются суммы элементов строк матрицы:

import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier;

public class Main {

private static int matrix[ ][ ] =

 

{

};

// инициализация или чтение матрицы

private static int results[ ];

 

static Boolean flag = false;

 

private static class Summator extends Thread {

int row;

 

// индекс строки для экземпляра сумматора

CyclicBarrier barrier;

// барьерный синхронизатор

Summator( CyclicBarrier barrier, int row ) { // конструктор сумматора this.barrier = barrier;

this.row = row;

}

java.util.concurrent

Синхронизаторы. Барьеры (4)

public void run( ) {

// метод потока

int columns = matrix[ row ].length;

 

int sum = 0;

 

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

// собственно суммирование

sum += matrix[ row ][ i ];

 

}

results[ row ] = sum;

System.out.println("Сумма элементов строки " + row + " равна: " + sum); try { // ожидание всех остальных

barrier.await( );

}catch ( InterruptedException ex ) { ex.printStackTrace( );

}catch ( BrokenBarrierException ex ) {

ex.printStackTrace( );

}

}

}

java.util.concurrent

Синхронизаторы. Барьеры (4)

public static void main( String args[ ] ) {

 

// здесь объявления

 

final int rows = matrix.length;

 

results = new int[ rows ];

 

Runnable merger = new Runnable( ) {

// внутренний класс

public void run() {

// сложение сумм по строкам

int sum = 0;

 

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

 

sum += results[ i ];

 

synchronized( flag ) {

// извещение основного потока

flag.notifyAll( );

 

flag = true;

 

}

System.out.println("Сумма элементов матрицы равна: " + sum);

}

};

java.util.concurrent Синхронизаторы.

Барьеры (4)

CyclicBarrier barrier = new CyclicBarrier( rows, merger ); for ( int i = 0; i < rows; i++ ) { // запуск всех сумматоров

new Summator( barrier, i ).start( );

}

 

System.out.println( "Ожидание..." );

 

Сумма элементов строки 1 равна: 4 (9)

synchronized( flag ) {

while( !flag ){

Сумма элементов строки 2 равна: 9 (10)

try {

Сумма элементов строки 0 равна: 102 (8)

Сумма элементов строки 4 равна: 25 (12)

flag.wait( );

Ожидание (1)

} catch( InterruptedException e ) {

Сумма элементов строки 3 равна: 16 (11)

return;

Сумма элементов строки 5 равна: 612 (13)

}

Сумма элементов матрицы равна: 768 (13)

}

Вычисления закончены (1)

}

System.out.println( "Вычисления закончены" );

}

}

В скобках показаны идентификаторы потоков.

Соседние файлы в папке Презентации по Java