Programare Java Curs 4 2020
Programare Java Curs 4 2020
Programare Java
2020
Fire de execuție în Java
Cuprins
FACULTATEA DE ELECTRONICĂ, TELECOMUNICAŢII ŞI TEHNOLOGIA INFORMAŢIEI
1. Introducere
7. Întrebări
Fire de execuție în Java
1. Introducere
❖ Conceptul de multitasking
FACULTATEA DE ELECTRONICĂ, TELECOMUNICAŢII ŞI TEHNOLOGIA INFORMAŢIEI
- Java suportă atât operații pe fir unic de execuție (single-thread), cât și pe fire
multiple de execuție (multi-thread) .
- Un program single-thread are un singur punct de intrare ( metoda main() ) și un
singur punct de ieșire.
UNIVERSITATEA TEHNICĂ “GH. ASACHI” DIN IAŞI
A process or program has its own address space and control blocks. It is called
heavyweight because it consumes a lot of system resources. Within a process or
program, we can run multiple threads concurrently to improve the performance.
UNIVERSITATEA TEHNICĂ “GH. ASACHI” DIN IAŞI
Threads, unlike heavyweight process, are lightweight and run inside a single
process – they share the same address space, the resources allocated and the
environment of that process. It is lightweight because it runs within the context of a
heavyweight process and takes advantage of the resources allocated for that
program and the program’s environment. A thread must carve out its own resources
within the running process. For example, a thread has its own stack, registers and
program counter. The code running within the thread works only within that
context, hence, a thread (of a sequential flow of operations) is also called an
execution context.
Fire de execuție în Java
1. Introducere
❖ Conceptul de multithreading (fire multiple de execuție)
FACULTATEA DE ELECTRONICĂ, TELECOMUNICAŢII ŞI TEHNOLOGIA INFORMAŢIEI
Multithreading is also necessary to provide better interactivity with the users. For
example, in a word processor, while one thread is printing or saving the file, another
thread can be used to continue typing. In GUI applications, multithreading is
essential in providing a responsive user interface.
For this article, I shall assume that you understand Swing programming, as Swing
applications rely on multithreading (to perform their specific function, repaint and
process the events) and best to illustrate multithreading.
A typical Java program runs in a single process, and is not interested in multiple
processes. However, within the process, it often uses multiple threads to to run
multiple tasks concurrently. A standalone Java application starts with a single thread
(called main thread) associated with the main() method. This main thread can then
start new user threads.
Fire de execuție în Java
1. Introducere
❖ Fire de execuţie în Java
FACULTATEA DE ELECTRONICĂ, TELECOMUNICAŢII ŞI TEHNOLOGIA INFORMAŢIEI
Mașina JVM apelează metoda main( ). Dacă metoda main( ) lansează un nou fir de
execuție, firul de execuție principal poate fi temporar înghețat și începe rularea
noului fir de execuție. Mașina JVM comută execuția între firul nou și firul principal,
până când sunt executate ambele fire.
Fire de execuție în Java
2. Crearea unui fir de execuție
Pentru a dezvolta programe multithread, există două clase și o interfață în pachetul
FACULTATEA DE ELECTRONICĂ, TELECOMUNICAŢII ŞI TEHNOLOGIA INFORMAŢIEI
java.lang:
Thread
➢ clasa Thread
void join( )
➢ clasa ThreadGroup
void start ( )
UNIVERSITATEA TEHNICĂ “GH. ASACHI” DIN IAŞI
1. Crearea unei clase ce extinde clasa Thread și supradefinirea metodei run ().
fir.start( );
Fire de execuție în Java
2. Crearea unui fir de execuție
Exemplu:
class TestFir {
public static void main(String [] args ) {
FirExecutie t = new FirExecutie ();
// datorită extinderii clasei Thread putem apela metoda start ()
// și această metodă va apela metoda run ().
//start() este o metodă a clasei Thread.
t.start();
} // sf. main()
} // sf. clasa TestFir
Fire de execuție în Java
2. Crearea unui fir de execuție
❖Crearea unui fir de execuție utilizând interfața Runnable
FACULTATEA DE ELECTRONICĂ, TELECOMUNICAŢII ŞI TEHNOLOGIA INFORMAŢIEI
MyThread.start ( );
UNIVERSITATEA TEHNICĂ “GH. ASACHI” DIN IAŞI
Exemplu:
go( );
}
public void go( ) {
doMore( );
} 2
public void doMore( ) {
System.out.println(" In varful stivei");
}
}
Fire de execuție în Java
2. Crearea unui fir de execuție
❖ Crearea unui fir de execuție utilizând interfața Runnable
FACULTATEA DE ELECTRONICĂ, TELECOMUNICAŢII ŞI TEHNOLOGIA INFORMAŢIEI
class ThreadTest {
public static void main ( String [ ] args) {
Runnable threadJob = new MyRunnable( );
Thread myThread = new Thread(threadJob);
UNIVERSITATEA TEHNICĂ “GH. ASACHI” DIN IAŞI
myThread.start( ); //
1
System. out. println("Inapoi in main");
}
}
1 2
Fire de execuție în Java
2. Crearea unui fir de execuție
❖ Constructori şi metode ale clasei Thread:
FACULTATEA DE ELECTRONICĂ, TELECOMUNICAŢII ŞI TEHNOLOGIA INFORMAŢIEI
Thread(Runnable, String) Creează un obiect Thread cu un nume specificat, dintr-un obiect care
implementează interfaţa Runnable.
run() Implementeză metoda run a interfeţei Runnable. Această metodă trebuie suprascrisă
în toate subclasele şi conţine codul ce este executat de firul de execuţie.
start() Trece firul de execuţie în starea EXECUTABIL, astfel poate fi lansat în execuţie de către
planificatorul JVM.
getName() Returnează numele firului de execuţie.
currentThread() Este o metodă statică ce returnează o referinţă la firul curent aflat în execuţie.
sleep(long) Este o metodă statică ce trece firul curent aflat în execuţie în starea BLOCAT pentru un
număr de milisecunde specificat ca parametru, astfel încât alt fir de execuţie să poată
rula.
Interrupt() Întrerupe execuţia unui fir.
➢ în execuție (running)
➢ terminat
BLOCAT
Planificatorul JVM de
execuţie a firelor poate
3 decide lansarea în
execuţie a firului.
EXECUTABIL
% java ThreadTest
In varful stivei
Inapoi in main
% java ThreadTest
In varful stivei
Inapoi in main
% java ThreadTest
In varful stivei
Inapoi in main
% java ThreadTest
Inapoi in main
In varful stivei
Fire de execuție în Java
3. Stările unui fir de execuție
❖ “Adormirea” unui fir de execuție:
FACULTATEA DE ELECTRONICĂ, TELECOMUNICAŢII ŞI TEHNOLOGIA INFORMAŢIEI
try {
Thread.sleep(2000);
} catch (InterruptedException ex) {
UNIVERSITATEA TEHNICĂ “GH. ASACHI” DIN IAŞI
ex.printStackTrace( );
}
-fiecare fir de execuție are același lucru de făcut: execută un ciclu, afișând numele
firului de execuție curent la fiecare iterație.
- se va crea o instanță Runnable.
- se vor crea cele două fire de execuție, folosind același obiect Runnable (aceeași
sarcină de făcut).
- se denumesc firele de execuție.
- fiecare fir de execuție va parcurge ciclul for afișându-și de fiecare dată numele.
Fire de execuție în Java
4. Crearea și lansarea a două fire de execuție
FACULTATEA DE ELECTRONICĂ, TELECOMUNICAŢII ŞI TEHNOLOGIA INFORMAŢIEI
alfa.setName(“Primul fir”);
beta.setName(“Al doilea fir”);
alfa.start( );
beta.start( );
}
-Două sau mai multe fire de execuție care au acces la același obiect pot duce
un număr întreg.
- cu cât acest nivel este mai mare cu atât firul de execuție va avea
prioritate mai mare la resurse, acest lucru este determinat de varianta de
implementare a JVM.
UNIVERSITATEA TEHNICĂ “GH. ASACHI” DIN IAŞI
}
public void increment( ) {
int i=val; // partea critică a codului: adăugăm o unitate la valoarea pe care o
val=i+1; // avea în momentul “citirii” ( nu la valoarea curentă)
}
}
public class TestSincro {
public static void main (String [ ] args) {
Sincro job = new Sincro( ) ;
Thread alfa = new Thread(job);
Thread beta = new Thread(job);
alfa.start( );
beta.start( );
}
}
Fire de execuție în Java
6. Sincronizarea firelor de execuție
❖ problema actualizării pierdute
O posibilă rulare a programului anterior:
FACULTATEA DE ELECTRONICĂ, TELECOMUNICAŢII ŞI TEHNOLOGIA INFORMAŢIEI
synchronized (this) {
met2( );
met3( );
}
}
Atunci când folosim cuvântul cheie synchronized în interiorul unei metode, nu în
declarația acesteia, trebuie să-i furnizăm ca argument obiectul a cărui cheie trebuie
să o obțină firul de execuție.
Conceptul de monitor: obiect care permite numai și numai unui singur fir de
execuție să apeleze o metodă a obiectului, la un moment dat.
Fire de execuție în Java
6. Sincronizarea firelor de execuție
❖ problema actualizării pierdute
O posibilă execuție a programului după sincronizarea metodei increment( ):
FACULTATEA DE ELECTRONICĂ, TELECOMUNICAŢII ŞI TEHNOLOGIA INFORMAŢIEI
-ș.a.m.d.
Fire de execuție în Java
6. Sincronizarea firelor de execuție
❖ blocajul firelor de execuție
FACULTATEA DE ELECTRONICĂ, TELECOMUNICAŢII ŞI TEHNOLOGIA INFORMAŢIEI
- apare atunci când două fire de execuție dețin fiecare câte o cheie de care are
nevoie celălalt fir.
- Java nu are un mecanism pentru rezolvarea blocajelor.
- este sarcina programatorului să proiecteze corect programele, urmărind ordinea în
UNIVERSITATEA TEHNICĂ “GH. ASACHI” DIN IAŞI
- prin apelul unui metode wait( ) a unui obiect, firul de execuție din care se face
acest apel trece în starea ÎN AŞTEPTARE.
- firul rămâne în această stare până când un alt fir de execuție va apela una din
metodele notify( ) pentru același obiect.
UNIVERSITATEA TEHNICĂ “GH. ASACHI” DIN IAŞI