Multithread in Java e priorità
La funzionalità multithreading in Java è quella che consente l’esecuzione simultanea di due o più parti di un programma per il massimo utilizzo della CPU. Ogni parte del programma viene chiamata thread. Quindi, i thread sono processi leggeri all’interno di un processo.
I thread possono essere creati utilizzando due meccanismi:
- Estensione della classe Thread
- Implementazione dell’interfaccia eseguibile
Creazione di thread estendendo la classe Thread
Creiamo una classe che estende la classe java.lang.Thread . Questa classe ...Leggi di più
sovrascrive il metodo run() disponibile nella classe Thread. Un thread inizia la sua vita all’interno del metodo run(). Creiamo un oggetto della nostra nuova classe e chiamiamo il metodo start() per avviare l’esecuzione di un thread. Start() richiama il metodo run() sull’oggetto Thread.
public class Main {
public static void main(String[] args) {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Thread 1 in esecuzione");
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Thread 2 in esecuzione");
}
});
t1.start();
t2.start();
}
}
Creazione di thread implementando l’interfaccia Runnable
Creiamo una nuova classe che implementa l’interfaccia java.lang.Runnable e sovrascrive il metodo run(). Quindi istanziamo un oggetto Thread e chiamiamo il metodo start() su questo oggetto.
public class MultithreadingDemo implements Runnable {
public void run()
{
try {
// Visualizzazione del thread in esecuzione
System.out.println(
"Thread " + Thread.currentThread().getId()
+ " is running");
}
catch (Exception e) {
// eventuale eccezione
System.out.println("Exception is caught" + e.getMessage());
}
}
}
// Main Class
class Multithread {
public static void main(String[] args)
{
int n = 8; // Number of threads
for (int i = 0; i < n; i++) {
Thread object
= new Thread(new MultithreadingDemo());
object.start();
}
}
}
In conclusione
Se estendiamo la classe Thread, la nostra classe non può estendere nessun’altra classe perché Java non supporta l’ereditarietà multipla. Ma, se implementiamo l’interfaccia Runnable, la nostra classe può ancora estendere altre classi base.
Possiamo ottenere le funzionalità di base di un thread estendendo la classe Thread perché fornisce alcuni metodi integrati come yield(), interrupt() ecc. che non sono disponibili nell’interfaccia Runnable.
L’uso di runnable ti darà un oggetto che può essere condiviso tra più thread.
Parliamo ora di come ottenere e impostare la priorità di un thread in java.
public final int getPriority(): il metodo java.lang.Thread.getPriority() restituisce la priorità del thread specificato.
public final void setPriority(int newPriority): il metodo java.lang.Thread.setPriority() modifica la priorità del thread nel valore newPriority. Questo metodo genera IllegalArgumentException se il valore del parametro newPriority supera il limite minimo(1) e massimo(10).
Il thread con la priorità più alta avrà una possibilità di esecuzione prima degli altri thread. Supponiamo che ci siano 3 thread t1, t2 e t3 con priorità 4, 6 e 1. Quindi, il thread t2 verrà eseguito per primo in base alla priorità massima 6, dopodiché verrà eseguito t1 e quindi t3.
Ora smanettoni vi starete chiedendo cosa succede se assegniamo le stesse priorità ai thread ?
Semplice, se due thread hanno la stessa priorità, non possiamo aspettarci quale thread verrà eseguito per primo. Dipende dall’algoritmo del thread scheduler (Round-Robin, First Come First Serve, ecc.)
Se in questo articolo ci sono degli errori o hai dei suggerimenti, faccelo sapere!