- •Средства пакета java.util.concurrent
- •java.util.concurrent Интерфейс Callable
- •java.util.concurrent Executor Framework (1)
- •java.util.concurrent Executor Framework (2)
- •java.util.concurrent Executor Framework (3)
- •java.util.concurrent Executor Framework (4)
- •java.util.concurrent Executor Framework (5)
- •java.util.concurrent Executor Framework (6)
- •java.util.concurrent Executor Framework (7)
- •java.util.concurrent Executor Framework (8)
- •java.util.concurrent Executor Framework (9)
- •java.util.concurrent Executor Framework (10)
- •java.util.concurrent Executor Framework (11)
- •java.util.concurrent
- •java.util.concurrent
- •java.util.concurrent
- •java.util.concurrent
- •java.util.concurrent Еще одно расширение
- •java.util.concurrent.locks
- •java.util.concurrent.locks Блокировки (1)
- •java.util.concurrent.locks Блокировки (2)
- •java.util.concurrent.locks Блокировки (3)
- •java.util.concurrent.locks Блокировки (4)
- •java.util.concurrent.locks Блокировки (5)
- •java.util.concurrent.locks Блокировки (7)
- •java.util.concurrent
- •java.util.concurrent
- •java.util.concurrent
- •java.util.concurrent
- •java.util.concurrent
- •java.util.concurrent
- •java.util.concurrent Синхронизаторы.
- •java.util.concurrent
- •java.util.concurrent
- •java.util.concurrent Синхронизаторы.
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( "Вычисления закончены" );
}
}
В скобках показаны идентификаторы потоков.
