Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Sintesi sui Thread in Java, Appunti di Programmazione Java

Sintesi su cosa sono i thread, la loro differenza dai processi e su come vengono implementati in Java.

Tipologia: Appunti

2018/2019

Caricato il 09/09/2021

giuseppe-leocata
giuseppe-leocata 🇮🇹

3 documenti

1 / 2

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
Mi parli di Thread
Un thread lo si può definire come un flusso di controllo all’interno di un processo. (il processo è un programma in
esecuzione).
Un thread lo si può definire anche come un flusso di esecuzione indipendente all’interno ad un processo, asincrono a
sé stante.
Servono per far che un programma, durante la sue esecuzione, e quindi il processo, riesca ad eseguire più attività
contemporaneamente.
Si utilizza un codice multi-threading anziché un multi-processo perché i context switch dei thread producono un
overhead molto inferiore ai context switch dei processi
Thread in Java: Java ha I thread native, cioé sono supportati dal linguaggio
In Java:
- il processo è un’istanza della JVM
(un processo contiene lheap (ogni cosa che deriva da un new) e le variabili globali)
- i thread sono degli stati a Run Time della stessa
(un thread contiene il Runtime stack (stack delle invocazioni di metodi) e le variabili locali di un metodo)
Vi è una classe, “Thread”, presente nel Package Java.lang, la quale si occupa dell’ ”astrazione” del concetto di
Thread: un thread può essere creato generando un’istanza di un oggetto di tipo Thread, e per far ciò è necessario
implementare l’interfaccia Runnable, e per implementarla, una classe deve soltanto implementare un singolo metodo
denominato run() dove, all’interno, occorre specificare ciò il thread deve fare.
Dopo, occorre creare un’istanza di un oggetto di tipo Thread tramite i costruttori.
Dopo che è stato creato, il nuovo thread non potrà essere eseguito finché non viene chiamato metodo start() il
quale esegue una chiamata al metodo run().
In java ad ogni oggetto sono associati nativamente:
Un built-in LOCK
Una built-in CONDITION VARIABLE
(un lock è una risorsa del sistema che può essere posseduta da un solo thread alla volta)
o Concorrenza nei Thread
i thread condividono la memoria (e le risorse) di un processo, di conseguenza, mentre un thread esegue
unoperazione su un oggetto, un altro thread potrebbe intercalare le sue azioni sullo stesso oggetto
rischiando di lasciarlo in uno stato indefinito [RACE CONDITION].
Per evitare ciò, Java mette a disposizione uno strumento importante: il metodo Synchronized:
Dichiarando un metodo synchronized si vincola l’esecuzione del metodo ad un solo thread alla volta, infatti,
se un thread richiede l’esecuzione di un metodo synchronized, per superarlo quindi, deve prima acquisire
lownership del lock delloggetto su cui vorrebbe agire: se vi è già un thread in esecuzione allora significa che
il lock lo possiede questultimo, e quindi viene sospeso e messo in attesa nella entry set del lock
È possibile “proteggere” con synchronized non solo metodi interi, ma anche solo porzioni di metodi,
definendo dei blocchi synchronized (si passa a parametro l’oggetto col lock nativo).
Questo era dunque il modo in cui viene sfruttata la built-in lock di un oggetto.. mentre il meccanismo della
condition variable permette ad un thread, che non è in grado di progredire, di lasciare temporaneamente la
sezione critica, e quindi di rilasciare il lock, per poi ritornarci in seguito.
La gestione della condition variable avviene grazie ai metodi wait, notify e notifyAll.
pf2

Anteprima parziale del testo

Scarica Sintesi sui Thread in Java e più Appunti in PDF di Programmazione Java solo su Docsity!

  • Mi parli di Thread Un thread lo si può definire come un flusso di controllo all’interno di un processo. (il processo è un programma in esecuzione). Un thread lo si può definire anche come un flusso di esecuzione indipendente all’interno ad un processo, asincrono a sé stante. Servono per far sì che un programma, durante la sue esecuzione, e quindi il processo, riesca ad eseguire più attività contemporaneamente. Si utilizza un codice multi-threading anziché un multi-processo perché i context switch dei thread producono un overhead molto inferiore ai context switch dei processi

Thread in Java: Java ha I thread native, cioé sono supportati dal linguaggio

In Java:

  • il processo è un’istanza della JVM (un processo contiene l’heap (ogni cosa che deriva da un new) e le variabili globali)
  • i thread sono degli stati a Run Time della stessa (un thread contiene il Runtime stack (stack delle invocazioni di metodi) e le variabili locali di un metodo) Vi è una classe, “Thread”, presente nel Package Java.lang, la quale si occupa dell’ ”astrazione” del concetto di Thread: un thread può essere creato generando un’istanza di un oggetto di tipo Thread, e per far ciò è necessario implementare l’interfaccia Runnable, e per implementarla, una classe deve soltanto implementare un singolo metodo denominato run() dove, all’interno, occorre specificare ciò il thread deve fare. Dopo, occorre creare un’istanza di un oggetto di tipo Thread tramite i costruttori. Dopo che è stato creato, il nuovo thread non potrà essere eseguito finché non viene chiamato metodo start() il quale esegue una chiamata al metodo run(). In java ad ogni oggetto sono associati nativamente: ▪ Un built-in LOCK ▪ Una built-in CONDITION VARIABLE (un lock è una risorsa del sistema che può essere posseduta da un solo thread alla volta) o Concorrenza nei Thread i thread condividono la memoria (e le risorse) di un processo, di conseguenza, mentre un thread esegue un’operazione su un oggetto, un altro thread potrebbe intercalare le sue azioni sullo stesso oggetto rischiando di lasciarlo in uno stato indefinito [RACE CONDITION]. Per evitare ciò, Java mette a disposizione uno strumento importante: il metodo Synchronized: Dichiarando un metodo synchronized si vincola l’esecuzione del metodo ad un solo thread alla volta, infatti, se un thread richiede l’esecuzione di un metodo synchronized, per “superarlo” quindi, deve prima acquisire l’ownership del lock dell’oggetto su cui vorrebbe agire: se vi è già un thread in esecuzione allora significa che il lock lo possiede quest’ultimo, e quindi viene sospeso e messo in attesa nella entry set del lock È possibile “proteggere” con synchronized non solo metodi interi, ma anche solo porzioni di metodi, definendo dei blocchi synchronized (si passa a parametro l’oggetto col lock nativo). → Questo era dunque il modo in cui viene sfruttata la built-in lock di un oggetto.. mentre il meccanismo della condition variable permette ad un thread, che non è in grado di progredire, di “lasciare” temporaneamente la sezione critica, e quindi di rilasciare il lock, per poi ritornarci in seguito. La gestione della condition variable avviene grazie ai metodi wait, notify e notifyAll.

Condition variables: forniscono un meccanismo per sospendere (wait) l’esecuzione di thread fino a che non vengono notificati da altri thread che una qualche condizione risulta essere verificata. wait(): il thread che invoca questo metodo rilascia il lock associato all’istanza e viene sospeso fintanto che la condizione non diventa vera [entra nella wait set] notify(): è il metodo che invoca il thread che ha acquisito il lock rilasciato precedentemente dal thread che ha invocato wait: comporta la selezione (arbitraria) di un qualsiasi thread in attesa nel wait set, che viene messo nell’entry set e quindi risvegliato. notifyAll(): comporta l’estrazione di tutti i thread da wait set ed il loro inserimento in entry set. o A che serve il synchronized? Rende atomica una sequenza di operazioni synchronized = check sul lock