Sincronizarea cu timpul real Panificarea unor actiuni pentru o singura executie sau pentru executii repetate la intervale regulate. PASI: -Crearea unei subclase Actiune a lui TimerTask si supreadefinirea metodei run. -Crearea unui obiect de tip Actiune(instanta a clasei Actiune); -Crearea unui fir de executie prin instantierea clasei Timer; -Planificarea la executie a obiectului de tip Actiune, folosind metoda schedule din clasa Timer;
Algoritmi Paraleli si Distribuiti 2 Clasa Timer public class Timer extends Object -Ofera un mecanism de programare in executie a fireor. Constructori : public Timer() public Timer(boolean isDaemon) isDaemon=true daca firul este Daemon public Timer(String name) -Creeaz un timer nou al crui fir asociat are numele specificat. public Timer(String name, boolean isDaemon) name si isDaemon au semnificatia de mai sus Algoritmi Paraleli si Distribuiti 3 Clasa Timer(metode) Public void schedule(TimerTask task, long delay) Executa sarcina specificat, dup ntrzierea specificat. public void schedule(TimerTask task, Date time) Executa sarcina specificat, la momentul specificat public void schedule(TimerTask task, long delay, long period) Repeta executia cu perioada specificata cu intarzierea delay. public void schedule(TimerTask task, Date firstTime, long period) Repeta executia cu perioada specificata incepand cu firstTime. public void scheduleAtFixedRate(TimerTask task, long delay, long period) Repeta executia cu intarzierea delay si cu perioada period. public void scheduleAtFixedRate(TimerTask task, Date firstTime, long period) Repeta executia incepand cu firstTime si cu perioada period.
Algoritmi Paraleli si Distribuiti 4 Clasa TimerTask public abstract class TimerTask extends Objectimplements Runnable Constructor : protected TimerTask() Metode : public abstract void run() public boolean cancel() public long scheduledExecutionTime() Algoritmi Paraleli si Distribuiti 5 Clasele Timer si TimerTask (Exemplu) class Atentie extends TimerTask { public void run () { Toolkit.getDefaultToolkit(). beep (); System.out.print ("."); } } class Alarma extends TimerTask { public String mesaj ; public Alarma ( String mesaj ) { this . mesaj = mesaj ; } public void run () { System . out. println ( mesaj ); } } Algoritmi Paraleli si Distribuiti 6 Clasele Timer si TimerTask (Exemplu) public class TestTimer { public static void main ( String args []) { // Setam o actiune repetitiva , cu rata fixa final Timer t1 = new Timer (); t1. scheduleAtFixedRate ( new Atentie () , 0, 1*1000) ; // Folosim o clasa anonima pentru o alta actiune Timer t2 = new Timer (); t2. schedule ( new TimerTask () { public void run () { System . out. println ("S-au scurs 10 secunde ."); // Oprim primul timer t1. cancel (); } }, 10*1000) ; Algoritmi Paraleli si Distribuiti 7 Clasele Timer si TimerTask (Exemplu) // Setam o actiune pentru ora 22:30 Calendar calendar = Calendar . getInstance (); calendar .set( Calendar . HOUR_OF_DAY , 22); calendar .set( Calendar .MINUTE , 30); calendar .set( Calendar .SECOND , 0); Date ora = calendar . getTime (); Timer t3 = new Timer (); t3. schedule ( new Alarma (" Toti copiii la culcare !"), ora ); } }
Algoritmi Paraleli si Distribuiti 8 Metode de sincronizare Java Limbajul de programare Java ofer dou mecanisme de sincronizare de baz: -Metode sincronizate i -Declaraii sincronizate.
Mai complex a doua, declaraiile sincronizate, Algoritmi Paraleli si Distribuiti 9 Metode sincronizate class Counter { private int c = 0;
public void increment() { c++; }
public void decrement() { c--; }
public int value() { return c; } }
Algoritmi Paraleli si Distribuiti 10 Evolutie posibila a doua fire A si B Metoda increment() 1. Preluare valoarea curent c. 2. Incrementare c cu 1. 3. Depounere napoi valoare n c. presupunem c=0. 1. A: Preluare valoarea curent c. 2. B : Preluare valoarea curent c. 3. A: Incrementare c cu 1; rezultatul este 1. 4. B: Incrementare c cu 1; rezultatul este 1. 5. A: Depounere napoi valoare n c; c este acum 1. 6. B: Depounere napoi valoare n c; c este acum 1.
Rezultat final c=1 FALS! Algoritmi Paraleli si Distribuiti 11 Metode sincronizate public class SynchronizedCounter { private int c = 0; public synchronized void increment() { c++; } public synchronized void decrement() { c--; } public synchronized int value() { return c; } }
Algoritmi Paraleli si Distribuiti 12 Declaraiile sincronizate O alt modalitate de a crea cod sincronizat este cu declaraiile sincronizate. Spre deosebire de metodele sincronizate, declaraiile sincronizate trebuie s precizeze obiectul care prevede blocare intrinsec:
Algoritmi Paraleli si Distribuiti 13 Declaraiile sincronizate n acest exemplu, metoda addName trebuie s sincronizeze modificrile aduse in nameList pentru lastName i nameCount
Algoritmi Paraleli si Distribuiti 14 Declaraiile sincronizate Utile pentru mbuntirea sincronizarii cu granulaie fin. Dou cmpuri C1 i C2, care nu sunt utilizate mpreun. Toate actualizrile la aceste domenii trebuie s fie sincronizate, dar C1 si C2 sunt independente. Vom crea dou obiecte doar pentru a oferi lacate de sincronizare. Algoritmi Paraleli si Distribuiti 15 Declaraiile sincronizate public class MsLunch { private long c1 = 0; private long c2 = 0; private Object lock1 = new Object(); private Object lock2 = new Object(); public void inc1() { synchronized(lock1) { c1++; } } public void inc2() { synchronized(lock2) { c2++; } } }
Algoritmi Paraleli si Distribuiti 16 Declaraiile sincronizate class Counter { private int c = 0; private Object lockid = new Object(); public void increment() { synchronized(lockid) { c++; } } public void decrement() { synchronized(lockid) { c--; } } public int value() { synchronized(lockid) {return c; } } } Algoritmi Paraleli si Distribuiti 17 Sincronizare reentranta Permite unui fir sa dobndeasca blocarea multipla. Aceasta descrie o situaie n care codul sincronizat, direct sau indirect, invoc o metod care conine, de asemenea, cod sincronizat, i ambele seturi de cod folosesc acelai sistem de blocare. Fr sincronizare reintranta,acest lucru nu este posibil. Pentru realizarea sincronizarii reentrante sunt necesare eforturi suplimentare cu metode sau blocuri sincronizate. Exista alte solutii: Variabile atomice Blocare explicita
Algoritmi Paraleli si Distribuiti 18 Variabile Atomice PERMIT SINCRONIZAREA REENTRANTA import java.util.concurrent.atomic.AtomicInteger; class AtomicCounter { private AtomicInteger c = new AtomicInteger(0); public void increment() { c.incrementAndGet(); } public void decrement() { c.decrementAndGet(); } public int value() { return c.get(); } } Algoritmi Paraleli si Distribuiti 19 Guarded Blocks Bloc de veghe pentru testarea indeplinirii unei conditii. INCORECT ! public void guardedJoy() { while(!joy) { } } CORECT ! public synchronized guardedJoy() { while(!joy) { try { wait(); } catch (InterruptedException e) {} } }
Algoritmi Paraleli si Distribuiti 20 InterProcess Communication Mecanism elegant de comunicare prin metodele: -wait( )- spune firuli de asteptare s renune la monitor i sa hiberneze pana la o notificare. -notify( )-trezete primul fir de executie care a apelat wait() de pe acelai obiect. -notifyAll( )-trezete toate firele de executie care au apelat wait() de pe acelai obiect. Evita sondarea repetata referitor la eliberarea monitorului. Firul cu cea mai mare prioritate va rula primul. Aceste metode sunt implementate ca metode finale n Object, deci toate clasele le au. public final void wait( ) throws InterruptedException public final void wait(long timeout) throws InterruptedException public final void notify( ) public final void notifyAll( )
Algoritmi Paraleli si Distribuiti 26 Blocare explicita in Java 5 public class ConcurrentIntegerArray { private final Lock lock = new ReentrantLock(); private final int[] arr; public ConcurrentIntegerArray(int size) { arr = new int[size]; } public void set(int index, int value) { lock.lock(); try { arr[index] = value; } finally { lock.unlock(); } } public int get(int index) { lock.lock(); try { return arr[index]; } finally { lock.unlock(); } }}
Algoritmi Paraleli si Distribuiti 27 Clasa ReentrantLock public class ReentrantLock extends Object implements Lock, Serializable Constructori : public ReentrantLock() public ReentrantLock(boolean fair) Algoritmi Paraleli si Distribuiti 28 Clasa ReentrantLock- Metode public void lock() Blocheaza accesul dac nu este blocat de un alt fir i se ntoarce imediat, altfel asteapta dezactivat in coada. public boolean tryLock() Blocheaza accesul,in cazul n care este disponibil la momentul de invocare fara a sta la coada si intoarce true. Altfel intoarce false. public boolean tryLock(long timeout,TimeUnit unit) throws InterruptedException Blocheaza accesul,in cazul n care este disponibil la momentul de invocare fara a sta la coada mai mult de timeout unitati de timp si intoarce true. Altfel intoarce false.
Algoritmi Paraleli si Distribuiti 29 Clasa ReentrantLock- Metode public void unlock() Elibereaza blocarea. public int getHoldCount() Returneaza numarul de blocari public boolean isHeldByCurrentThread() Interogare daca exista blocare deinuta de firul curent. public boolean isLocked() Interogare daca exista blocare deinuta de orice fir. public final int getQueueLength() Intoarce lungimea cozii protected Collection<Thread> getQueuedThreads() Intoarce colectia firelor din coada
Algoritmi Paraleli si Distribuiti 30 Exemplu isHeldByCurrentThread() class X { ReentrantLock lock = new ReentrantLock(); // ... public void m() { assert !lock.isHeldByCurrentThread(); lock.lock(); try { // ... method body } finally { lock.unlock(); } } } Algoritmi Paraleli si Distribuiti 31 Exemplu getHoldCount class X { ReentrantLock lock = new ReentrantLock(); // ... public void m() { assert lock.getHoldCount() == 0; lock.lock(); try { // ... method body } finally { lock.unlock(); } } } Algoritmi Paraleli si Distribuiti 32 Clasa ReentrantLock class X { private final ReentrantLock lock = new ReentrantLock(); // ... public void m() { lock.lock(); // block until condition holds try { // ... method body } finally { lock.unlock() } } } Algoritmi Paraleli si Distribuiti 33 Deadlock Algoritmi Paraleli si Distribuiti 34 Interfata Executor Pachetul java.util.concurrent definete trei interfee executor:
- Executor, o interfa simpl, care susine lansarea de noi sarcini. - ExecutorService, o subinterfata a lui executor, care adaug facilitati pentru gestionarea ciclului de via a sarcinilor. -ScheduledExecutorService, o subinterface a lui ExecutorService, care susine planificarea sarcinilor.
Algoritmi Paraleli si Distribuiti 35 Interfata Executor public interface Executor Ofer o metod unic, execute, Dac r este un obiect Runnable, iar e este un obiect Executor putei nlocui (new Thread(r)).start(); Cu Executor e = anExecutor; e.execute(r); e.execute(new RunnableTask1()); Aparent Executorul, face acelai lucru, dar in realitate probabil: -utilizeaza un fir de lucru existent pentru a rula r, sau -plaseaza r ntr-o coad pentru a atepta un fir sa devena disponibil etc.
Algoritmi Paraleli si Distribuiti 36 Interfata Executor n cel mai simplu caz, un executor poate rula taskul transmis imediat n firul apelantului:
class DirectExecutor implements Executor { public void execute(Runnable r) { r.run(); } }
Algoritmi Paraleli si Distribuiti 37 Interfata Executor Executorul de mai jos creaza un nou fir pentru fiecare task.
class ThreadPerTaskExecutor implements Executor { public void execute(Runnable r) { new Thread(r).start(); } }
Algoritmi Paraleli si Distribuiti 38 Interface Future public interface Future<V> Un Future reprezint rezultatul unui calcul asincron. Sunt furnizate metode pentru a verifica dac calcul este terminat, pentru asteptarea finalizarii acestuia, precum i pentru a prelua rezultatul calculului. Metode suplimentare sunt furnizate pentru a urmarii evolutia firului.
Algoritmi Paraleli si Distribuiti 39 Metode boolean cancel(boolean mayInterruptIfRunning) n cazul n care sarcina a nceput deja, atunci parametrul mayInterruptIfRunning determin intreruperea n vederea finalizarii. boolean isCancelled() boolean isDone() Returneaz true dac aceast sarcin este finalizat. V get() throws InterruptedException, ExecutionException Ateapt dac este necesar pentru a finaliza calculul, iar apoi extrage rezultatul. V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException
Algoritmi Paraleli si Distribuiti 40 Interfata Callable public interface Callable<V> Un task care returneaz un rezultat i poate arunca o excepie. Defineste o metod unic, fr argumente numita call. Metoda : V call() throws Exception
Algoritmi Paraleli si Distribuiti 41 ExecutorService public interface ExecutorService extends Executor
Un executor , care ofer metode de gestionare a firelor in executie sau in asteptare.
Algoritmi Paraleli si Distribuiti 42 ExecutorService-Metode void shutdown() -Iniiaz o oprire ordonat. Invocarea nu are nici un efect suplimentar n cazul n care firul este deja oprit. List<Runnable> shutdownNow() -Opreste toate taskurile active, -Opreste pornirea taskurilor in ateptare, i -Returneaz o list a taskurilor care au fost n ateptarea execuiei. boolean isShutdown() -Returneaza true daca acest Executor este inchis. boolean isTerminated() -Returneaz true dac toate taskurile au fost inchise. Algoritmi Paraleli si Distribuiti 43 ExecutorService-Metode boolean awaitTermination(long timeout, TimeUnit unit) throws interruptedException Blocheaza orice actiune pn cnd toate taskurile au finalizat executia dupa o cerere de nchidere, -timeout timpul maxim de asteptare. -unit unitatea de timp pentru argumentul timeout. <T> Future<T> submit(Callable<T> task) Dac dorii s blocai imediat pentru ateptarea rezultatului, putei utiliza construcii de forma : result = exec.submit(aCallable).get();
Algoritmi Paraleli si Distribuiti 44 ExecutorService-Metode Future<?> submit(Runnable task) Ca si precedenta numai ca metoda get() a lui Future ne va intoarce null dup finalizarea cu succes. <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException Execut taskurile din colectie , returnind o list de Future <T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException Execut sarcinile date, returnind rezultatele celor care a finalizat cu succes. Cele care dau eroare vor fi anulate.
Algoritmi Paraleli si Distribuiti 45 ScheduledExecutorService public interface ScheduledExecutorServiceextends ExecutorService Metodele interfetei creeaz sarcini cu ntrzieri diferite i returneaz un obiect de activitate, care poate fi folosite pentru a gestiona executarea firului.
Interfata ScheduledFuture public interface ScheduledFuture<V>extends Delayed, Future<V> long getDelay(TimeUnit unit) Intoarce timpul ramas de asteptare int compareTo(T o) Compara acest obiect ci o Algoritmi Paraleli si Distribuiti 46 Metode ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit) Creeaz i execut un fir care devine activdup ntrzierea dat. Returneaza un ScheduledFuture pentru gestionarea firului pn la finalizare i a crui metoda get () va returna null la finalizarea. <V> ScheduledFuture<V> schedule( Callable<V> callable, long delay, TimeUnit unit) Creeaz i execut un fir care devine activ dup ntrzierea dat. Returneaza un ScheduledFuture pentru gestionarea firului pn la finalizare i a crui metoda get () va returna rezultatul.
Algoritmi Paraleli si Distribuiti 47 Metode ScheduledFuture<?>scheduleAtFixedRate( Runnable command, long initialDelay, long period, TimeUnit unit) Creeaz i execut o aciune periodic care devine activata prima dat dup ntrzierea initialDelay apoi initialDelay + o perioad, apoi initialDelay + 2 * perioada, i aa mai departe. Dac executarea sarcinii se confrunt cu o excepie, execuiile ulterioare sunt suprimate. n caz contrar, sarcina se va termina numai prin anularea sau ncetarea executor. Returneaz un ScheduledFuture al crui get () va arunca o exceptie la anulare.
Algoritmi Paraleli si Distribuiti 48 Metode ScheduledFuture<?>scheduleWithFixedDelay(Runnable com mand, long initialDelay, long delay, TimeUnit unit) Creeaz i execut o aciune periodic care devine activa prima dat dup ntrzierea iniial dat, i, ulterior, cu ntrzierea data ntre ncetarea unei execui i nceperea urmtoareia. Dac se confrunt cu o excepie, execuiile ulterioare sunt suprimate. n caz contrar, sarcina se va termina numai prin anularea sau ncetarea executor. Returneaza un ScheduledFuture pentru gestionarea taskului pn la finalizarea sarcinii, i a crei get () metoda va arunca o exceptie la anulare.
Algoritmi Paraleli si Distribuiti 49 ScheduledExecutorService class BeeperControl { private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); public void beep() { final Runnable beeper = new Runnable() { public void run() { System.out.println("beep"); } };