lab4, 5, 6, 7(java) Flashcards
Cum implementam un nou thread in java?
varianta 1: putem sa cream o clasa care implementeaza interfata Runnable, si contine metoda void run()
varianta 2!!!: putem sa cream o clasa care EXTINDE clasa thread si suprascrie metoda void run()
Cum rulam in paralel noul thread in java?
(daca am folosit class Task implements Runnable):
Thread t = new Thread(new Task());
t.start();
(!!!daca am folosit class MyThread extends Thread):
MyThread t = new MyThread();
t.start();
start() vs run() ?
cand e apelat run() codul prezent in metoda se rueaza secvential in cadrul thread-ului care a apelat-o.
cand e apelat start() JVM va crea un nou thread care va executa instructiunile din metoda run() in PARALEL cu threadul care a apelat metoda start().
asteptarea terminarii executiei unui thread
pentru a astepta terminarea unui thread, avem metoda public final void join() a clasei thread. Aceasta metoda arunca si exceptii de tipul InterruptedException
cum trimitem parametrii unui thread?
pentru a trimite parametrii doar adaugam o noua variabila in clasa pe care extindem thread ( sau pe care implementam runnable) si apoi voi seta acest parametru in contstructorul clasei
public class Task extends Thread{
public Task(int id) {
this.id = id;
}
}
…
public static void main(){
Thread t = new Task(id);
}
cum obtinem rezultate dintr-un thread?
pentru a obtine un rezultat de la thread, putem fie obtine un getter
public int getResult() {
return result;
}
fie putem sa facem campul ala public si sa l accesam din main (why tho?)
cuvantul cheie synchronized
1.Daca o metoda e definita ca si “synchronized” atunci poate fi rulata de un singur thread in acelasi timp. Daca “monitorul” nu este detinut de niciun thread si metoda este apelata, atunci se va bloca monitorul pana cand metoda se termina de executat pe acel thread.
- Daca am doar doar un bloc de instructiune synchronized si nu o intreaga metoda, atunci codul dintre acoladele lui synchronized va folosi monitoril obiectului dintre paranteze:
synchronized(this){ // aici folosesc monitorul obiectului curent, adica e same shit ca si cum as avea metoda synchronized care face codul asta
…
}
- Daca am o metoda STATIC synchronized se va incerca obtinerea monitorului asociat clasei, deoarece metoda statica apartine clasei, nu a unei instante a clasei.
ce inseamna “reentrant” ?
metodele si blocurile de cod synchronized sunt reentrante. Daca un thread a obtinut monitorul unui obiect, atunci acel thread poate intra in orice alt bloc si metoda sinzcronizate ce sunt asociate cu acel obiect (implicit acel monitor).
ce e bariera ciclica (CyclicBarrier) ?
e un mecanism de (re)sincronizare a threadurilor lafel ca o bariera obisnuita. In java, e clasa CyclicBarrier, la instantierea careia se specifica nr de threaduri pe care le va sincroniza.
apelul await() pe bariera ciclica poate arunca exceptiile BrokenBarrierException si InterruptedException
cuvantul cheie volatile ?
daca o variabila e volatile inseamna ca nu poate fi optimizata, fiecare scriere/citire a acesteia se realizeaza lucrand cu memoria RAM.
Variabilele volatile cresc timpul de executie pentru ca modificarile trebuie propagate celorlalte threaduri, in timp ce variabilele normale pot fi cache-uite.
De ce am folosi volatile?
Pentru ca sa prevenim optimizari incompatibile in combinatie cu modificarea valorii din alt thread/ a citirii unei date neactualizate. (idk man)
Ce e o operatie atomica?
O operatie ce nu poate fi divizata atunci cand este executata de catre un thread. (la a+= 2 de ex, mai intai avem citirea, apoi adunarea, apoi scrierea in a a valorii noi => NU e atomica)
De ce am folosi atomicitate?
Pentru ca sa putem sa avem de ex un contor sau un acumulator fara a mai folosi mecanisme de sincronizare.
Ce inseamna busy waiting?
Daca un thread dureaza mult sa se ruleze, si celelalte thread-uri tot verifica daca s-a rulat, degeaba, pt ca o sa se termine de rulat abia peste o tona de timp. Astfel, nu are sens ca mereu sa blochez un mutex, si sa verific daca s a terminat thread-ul, cand pot sa l rog pe thread sa ma anunte el cand s a terminat cu wait(), notify(), notifyAll().
ce fac wait(), notify() si notifyAll()
wait() : forteaza threadul curent sa intre in asteptare pana cand alt thread apeleaza notify() sau notifyAll() pe acelasi obiect. Pentru ca asta sa se intample, trebuie sa detina monitoful obiectului respectiv.
Detinerea monitorului se intampla cand
s-a executat o metoda / un bloc synchronized pe obiect
s-a executat o metoda synchronized statica pe clasa din care face parte obiectul
notify(): alege ALEATORIU un thread care a apelat wait() si il trece din waiting in running
notifyAll() trece toate thread-urile din waiting in running