Documente Academic
Documente Profesional
Documente Cultură
obiect
Curs 10 – fire de execuție, colecții
J
J Acest curs
› Thread pools
› Sincronizarea firelor de execuție
› Colecții
J Thread pool
› Grup de fire de execuție preinstanțiate, inactive, gata să fie lansate în
execuție.
› Se preferă utilizarea unui/unor thread pool atunci când sunt multe fire
de execuție utilizate în mod frecvent
› Implementarea variază de la un limbaj de programare la altul dar în
genere sunt necesare următoarele:
– Un mod de creare a firelor de execuție și reținerea lor în starea inactivă.
– Un container pentru stocarea firelor de execuție create (de obicei o coadă simplă/cu
priorități pentru a adăuga și elimina)
– Interfață standard pentru task-uri
› La crearea unui thread pool sunt instanțiate un număr de fire de execuție
pentru a le pune la dispoziție. În caz de necesitate pot fi adaugate și
altele noi.
J Thread pool
› Când unui pool îi este trimis un task, se preia un fir de execuție din
container sau așteaptă unul să devină disponibil și îi transmite task-ul
spre execuție
› Firul de execuție, se va activa și își va continua execuția apelând
metoda execute() a task-ului furnizat.
› Odată ce execuția este completă, firul de execuție se pune automat
în modul sleep() și apoi înapoi în thread pool pentru a fi reutilizat
› Odată ce firul de execuție este deja creat când cererea sosește,
întârzierea introdusă de crearea unui fir de execuție este eliminată,
făcând aplicația mult mai “responsive”
J Thread pool
J Thread pool - Java
› Un thread pool este soluția optimă pentru a organiza un număr mai
mare de fire de execuție ce rulează concurent.
› Java furnizeaza framework-ul Executor centrat în jurul interfeței
Executor, a subinterfeței ExecutorService și clasa
ThreadPoolExecutor ce implementează ambele interfețe.
› Clasa Executors este folosită pentru a executa taskuri într-un thread
pool, iar ExecutorService organizează și controlează taskurile.
› Prin utilizarea Executors, obiectele trebuie doar sa implementeze
Runnable și apoi trimise către executor pentru execuție.
› În acest fel programatorul se poate focusa pe ceea ce un fir de execuție
trebuie să execute lăsând “mecanica” firelor de execuție în seama thread
pool
J Executor
Metodă Scop
void execute (Runnable object) Execută task-ul
void shutdown () Închide executorul, dar permite task-urilor să se finalizeze. Odată
închis, executorul nu acceptă noi taskuri.
List<Runnable> shutdownNow() Închide imediat executorul, chiar dacă mai sunt fire de execuție
nefinalizate în pool. Returnează o listă de taskuri neterminate.
boolean isShutDown() Returnează true dacă executorul a fost închis
boolean isTerminated() Returnează true dacă toate task-urile în pool au fost terminate
ExecutorService Creează un thread pool cu un număr fixat de thread-uri care se
newFixedThreadPool(int execută simultan. Un thread poate fi folosit pentru a executa un alt
numberOfThreads) task după ce task-ul curent se termină. Dacă un thread se încheie
din cauza unei erori, un nou thread va fi creat pentru a-l înlocui
dacă toate thread-urile din pool nu sunt idle și mai sunt task-uri
așteptându-și execuția.
ExecutorService Creează un thread pool ce pornește noi thread-uri la nevoie, dar
newCachedThreadPool() reutilizează thread-urile construite înainte atunci când acestea sunt
disponibile. Un thread din cached pool va fi terminat dacă nu este
folosit timp de 60 de secunde. Cached pool-ul este util pentru
execuția task-urilor scurte.
J Thread pool - Java
public class Main {
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(3);
executor.execute(new RunnableTask1());
executor.execute(new RunnableTask2());
executor.execute(new RunnableTask3());
executor.execute(new RunnableTask4());
executor.shutdown();
}
}
› Clasele RunnableTask1, RunnableTask2 și RunnableTask3
implementează interfața Runnable și suprascriu metoda run().
Dacă se folosește:
ExecutorService executor = Executors.newFixedThreadPool(1);
GFG(T o) { GFG(Object o) {
obj = o; obj = o;
} }
T getob() { Object getob() {
return obj; return obj;
} }
} }
J Cum ”lucrează” TypeErasure
› Atunci când super class este Object