THREAD IN JAVA
DEFINIZIONE DI PROCESSO
Il processo è l’entità utilizzata dal sistema operativo per rappresentare una specifica esecuzione di un programma. In pratica un processo è un programma quando è in esecuzione.
PROCESSI
Un software solitamente è composto da uno o più file che sono compilati per essere eseguiti. L’installazione di un software prevede che questi file vengano copiati sul dispositivo. Quando eseguiamo un software, sul dispositivo viene generato un processo che:
- ha un ID univoco
- occupa una parte della memoria volatile (la RAM)
I THREAD
Abbiamo detto che un processo, in termini più semplici, è un programma in esecuzione. Uno o più thread vengono eseguiti nel contesto del processo. Un thread è l’unità di base a cui il sistema operativo alloca il tempo del processore.
I moderni Sistemi Operativi sono multitasking cioè sono in grado di eseguire più processi alla volta, anche se è il parallelismo che ci da questa illusione ottica, sono inoltre multithreading, per fare un esempio basta che apriamo un programma di videoscrittura come Word e ci accorgiamo mentre stiamo digitando che un thread si occupa del controllo ortografico, oppure possiamo pensare a un server web che accetta le richieste mentre altri thread le gestiscono. Questi sono solo alcuni esempi.
CICLO DI VITA DI UN THREAD
Un thread ha un ciclo di vita ben definito che comprende i seguenti stati:
- New
- Runnable
- Running
- Waiting
- Dead
New: È lo stato iniziale in cui si trova un nuovo thread.
Runnable: il thread si trova in questo stato quando è stato avviato ed è pronto per essere eseguito.
Running: è lo stato in cui si trova il thread quando inizia la sua esecuzione.
Waiting: il thread si trova in questo stato quando la sua esecuzione viene sospesa (ad es. quando viene eseguito un altro thread) per un determinato periodo di tempo.
Dead: un thread entra in questo stato al termine della sua esecuzione.
THREAD PRIORITY
La priority è un’informazione che indica allo scheduler il livello di importanza di un thread.
ATTENZIONE
L’ordine di esecuzione dei thread da parte della CPU non è determinato a priori. Tuttavia, se un certo numero di thread sono bloccati e in attesa di essere eseguiti, lo scheduler tende ad attivare prima quelli che hanno priorità maggiore. Se ci sono dei thread a priorità bassa, anche questi prima o poi verranno attivati dallo scheduler. In questo modo la starvation, ovvero l’impossibilità da parte di un processo pronto all’esecuzione di ottenere risorse hardware e software di cui necessita, viene evitata.
PRIORITY IN JAVA
Le priorità di un thread in Java vanno da 1 a 10:
- MIN_PRIORITY (1)
- MAX_PRIORITY (10)
Ogni thread, per default ha priorità NORM_PRIORITY (5).
I thread con priorità elevata sono più importanti ed in caso di necessità, vengono attivati dallo scheduler prima di quelli a priorità bassa.
CREARE UN THREAD IN JAVA
Per creare i thread in Java abbiamo due strade:
- creare una classe che estende la classe Thread
- creare una classe che implementa l’interfaccia Runnable
La classe java.lang.Thread
- La nostra classe deve ereditare la classe java.lang.Thread
- Il metodo più importante presente in questa classe Thread è run()
- Il metodo run() deve essere riscritto (bisogna fare l’override).
- Il metodo run() conterrà le istruzioni relative al task da eseguire.
- Il codice presente nel metodo run() sarà eseguito in maniera concorrente ad altri thread presenti in un programma
Per avviare un thread gli step sono:
- creare un’istanza della nostra classe che estende Thread
- invocare il metodo start() che si occuperà, dopo la configurazione del thread, di invocare il metodo run()
NOTA: il metodo run() non può essere invocato direttamente
Metodi utili:
- yield(), consente di suggerire allo scheduler di liberare la CPU e renderla disponibile a qualche altro thread
- sleep(), consente di cessare l’esecuzione per un dato numero di millisecondi
L’INTERFACCIA RUNNABLE
La nostra classe deve implementare l’interfaccia java.lang.Runnable
- Può essere utilizzata quando la nostra classe eredita già un’altra classe e quindi non possiamo estendere la classe Thread (ricorda che Java non supporta l’ereditarietà multipla!)
- L’interfaccia specifica che bisogna implementare il metodo run()
- Per creare un thread, è necessario utilizzare il costruttore della classe Thread passandogli come argomento l’istanza della nostra classe che implementa Runnable
LINK AI POST PRECEDENTI
LINK AL CODICE SU GITHUB
ESECUZIONE DEL CODICE DI ESEMPIO
- Scaricare il codice da GITHUB, lanciare il file JAR con il seguente comando in Visual Studio Code, posizionandosi nella directory contenente il JAR.
java -jar –enable-preview CorsoJava.jar
- Oppure mettere in esecuzione il main che si trova nel file CorsoJava.java.
Scrivi un commento