Paraleln programovn Pi pseudosouasnm bhu spolupracujcch proces i
Paralelní programování Při (pseudo)současném běhu spolupracujících procesů či vláken jsou nezbytné objekty zajišťující synchronizaci. Balíčky java. util. concurrent ~locks ~atomic umožňují rafinovanější synchronizaci pomocí synchronizačních tříd: • Semaphore - semafor • Count. Down. Latch – závora, jež se otevře po odpočtu či podmínce • Cyclic. Barrier – cyklická bariéra • Phaser – fázor: flexibilní cyklická bariéra se závorou • Exchanger – vekslák: dvě vlákna si mohou vyměnit své objekty při schůzce Dále obsahují: • Konkurentní kolekce • Pooly vláken: Fixní i dynamické Parallelní „rozděl a panuj“ Fork-Join PJV 27 1
java. util. concurrent javax. xml. ws Callable Executors Future <V> Response <V> Scheduled Future Delayed <T> Runnable Future <V> Executor Service Runnable <V> Runnable Scheduled. Future Abstract Executor Service java. lang <V> Fork. Join Pool Future Task <V> 1. 7 Scheduled Executor. Service Thread. Pool Executor Fork. Join Task Thread. Factory java. lang Completion Service PJV 27 Scheduled Thread. Pool Executor Thread Executor Completion Service Fork. Join Worker. Thread @Functional. Interface 2
java. util. concurrent java. util Map java. util Abstract Map <K, V> Concurrent Navigable. Map Concurrent Hash. Map Concurrent Skip. List. Map Array. Blocking Queue PJV 27 Concurrent Linked. Queue java. util Queue Blocking Queue 3
java. util. concurrent synchonizers Semaphore Queue java. util Abstract Queue <E> Array Blocking Queue Count. Down Latch Delay Queue Cyclic Barrier Linked Blocking Queue Phaser Priority Blocking Deque Exchanger Synchronous Queue Timeout Exception Linked Blocking Deque Broken. Barrier Exception Execution Exception Concurrent Linked Deque Rejected Execution Exception Cancellation Exception Priority Queue PJV 27 Deque Blocking Queue java. util Blocking Deque List Copy. On. Write Array. List java. util Set Copy. On. Write Array. Set Time. Unit
java. util. concurrent. locks Abstract Ownable Synchronized java. util. concurrent. atomic Condition Atomic Boolean Abstract Queued. Long Condition. Object Synchronized Abstract Queued Synchronized Condition. Object Read. Write Lock Reentrant Read. Lock Read. Write Lock Write. Lock PJV 27 Lock Atomic Integer Array Atomic Integer Field. Updater Atomic Integer Atomic Long Array Atomic Long Field. Updater Atomic Long Atomic Reference Array Atomic Reference Field. Updater Atomic Reference Lock Support Atomic Stamped Reference Reentrant Lock Atomic Markable Reference 5
Interfejs Lock je zámek, který spolu s objekty typu Condition dovoluje flexibilnější použití než synchronizované metody, jež jsou blokově strukturované. To si však vynucuje větší zodpovědnost – doporučuje se používat idiom: Lock lock =. . . lock( ); try { // akce } finally { lock. unlock( ); } • • • void lock( ) – běžné vlákno čeká až získá zámek void lock. Interruptibly( ) Condition new. Condition( ) – vrátí objekt typu Condition vázaný na zámek boolean try. Lock(. . . ) – získá zámek pokud je zrovna volný void unlock( ) – uvolnění zámku PJV 27 6
Interfejs Condition Objekty typu Condition jsou vázány na objekty typu Lock • • • void await(. . . ) – běžné vlákno čeká na signál nebo interrupt. boolean await(. . . ) – běžné vlákno čeká na signál či interrupt či čas. boolean await. Until( Date deadline. . . ) – obdobně void await. Interruptibly( ) – běžné vlákno čeká na signál void signal( ) – vzbudí jedno vlákno void signal. All( ) – vzbudí všechna vlákna PJV 27 7
Třída Semaphore Semafor je objekt čítající jakési žetony ( permits – je to jen číslo int ). Vlákno může semaforu žetony dodávat i odebírat pomocí jeho metod. Metody acquire(. . . ) vlákno blokují, pokud semafor nemá požadovaný počet žetonů. Vlákna by měla žetony při odchodu semaforu vrátit ( ! ) • Semaphore( int permits, boolean fair ) – žetony, fair ~ strategie FIFO • • • void acquire( ) – vlákno čeká na žeton void acquire( int permits ) – vlákno čeká na více žetonů boolean try. Acquire(. . . ) – snaží se získat promptně žetony void acquire. Uninterruptibly( int permits ) – vlákno čeká nepřerušitelně int available. Permits( ) – počet žetony void reduce. Permits( int permits ) – sníží počet žetonů aniž blokuje int drain. Permits( ) – odebere semaforu všechny žetony void release( int permits ) – dodá žetony int get. Queue. Length( ) – odhad počtu čekajících vláken boolean has. Queue. Threads( ) – zda nějaká vlákna čekají Collection get. Queued. Threads( ) – vrací čekající vlákna PJV 27 8
Příklad Semaphore sem = new Semaphore(-5); sem. release(15); sem. acquire( ); int k = sem. drain. Permits( ); sem. available. Permits( ); sem. release(2); sem. release( ); sem. acquire(4); // available Permits // -5 // 10 // 9 // k=4 // 0 // 2 // 3 blocked Jak patrno, Semaphore je důmyslnější než silniční semafor. V jednoduché variantě realizuje kritickou sekci takto: Semaphore sem = new Semaphore(1); sem. acquire( ); . . // kritická sekce sem. release( ); PJV 27 9
Třída Cyclic. Barrier Objekt této třídy propustí vlákna jakmile je dostatečný počet - tzv. party. Pak se opět uzavře do příchodu další party. Zadržování vláken lze časově omezit. Volitelně lze spustit vlastní vlákno při příchodu posledního účastníka party, a to ještě před uvolněním party. Konstruktory: public Cyclic. Barier( int parties ) public Cyclic. Barier( int parties, Runnable action ) Metody: • int await( … ) – vlákno čeká • boolean is. Broken( ) – • void reset( ) – dodá žetony • int get. Number. Waiting( ) – počet čekajících vláken • int get. Parties( ) – požadovaný počet čekajících vláken PJV 27 10
Interfejsy Callable a Future @Functional. Interface public interface Callable <V> { V call( ) throws Exception ; } public interface Future <V> { boolean cancel( ); V get(…) throws Interrupted. Exception, Execution. Exception ; boolean is. Cancel( ); boolean is. Done( ); } Použití: Executor. Service es = Executors. new. Cached. Thread. Pool( ); Future<V> fut = es. submit( callable ); try { V v = fut. get( ); } catch ( … | … ) { … } PJV 27 11
- Slides: 11