Sunteți pe pagina 1din 51

Algoritmi Paraleli si Distribuiti

Clasele Timer si TimerTask


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

public void addName(String name) {
synchronized(this) {
lastName = name;
nameCount++;
}
nameList.add(name);
}

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
21
Producator-Consumator(Incorect)
Algoritmi Paraleli si Distribuiti
22
Producator-Consumator(Incorect)
Put: 1
Get: 1
Get: 1
Get: 1
Get: 1
Get: 1
Put: 2
Put: 3
Put: 4
Put: 5
Put: 6
Put: 7
Get: 7

Algoritmi Paraleli si Distribuiti
23
Producator-Consumator(Corect)
Algoritmi Paraleli si Distribuiti
24
Producator-Consumator(Corect)
Put: 1
Get: 1
Put: 2
Get: 2
Put: 3
Get: 3
Put: 4
Get: 4
Put: 5
Get: 5


Algoritmi Paraleli si Distribuiti
25
Blocare explicita in Java 5
Lock lck = ...

lck.lock();
try {
... access shared resource
} finally {
lck.unlock();
}

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");
} };

final ScheduledFuture<?> beeperHandle =
scheduler.scheduleAtFixedRate(beeper, 10, 10,
SECONDS);
.
Algoritmi Paraleli si Distribuiti
50
ScheduledExecutorService
scheduler.schedule(new Runnable() {
public void run() {
beeperHandle.cancel(true);
} }, 60 * 60, SECONDS); } }

Algoritmi Paraleli si Distribuiti
51

S-ar putea să vă placă și