Vai al contenuto principale
Pubblicato il

Classe Thread in Java

Condividi:

Introduzione

La programmazione multithread è una tecnica che consente a un'applicazione di eseguire più operazioni simultaneamente. In Java, la classe Thread è la spina dorsale di questo tipo di programmazione.

Multithreading e I Suoi Vantaggi

Il multithreading, consentendo l'esecuzione parallela dei task, può aumentare significativamente le prestazioni delle applicazioni, specialmente quelle che eseguono operazioni intensive o bloccanti, come l'accesso a risorse di rete. Altri vantaggi includono:

  • Reattività: Un'applicazione con interfaccia grafica può continuare a rispondere all'utente mentre elabora task pesanti in background.
  • Risorse: Nei sistemi con più core CPU, il multithreading consente a un'applicazione di massimizzare l'utilizzo dei core disponibili.

Comprendere la Classe Thread

La classe Thread fornisce i mezzi per creare, controllare e terminare i thread. Oltre ai metodi già menzionati:

  • Thread.currentThread(): Restituisce un riferimento al thread attualmente in esecuzione.
  • Thread (oggetto).getState(): Restituisce lo stato corrente del thread.

Sfide della Programmazione Multithread

Sebbene potente, la programmazione multithread presenta delle sfide:

  • Concorrenza: La necessità di garantire che più thread non interferiscano tra loro durante l'accesso a risorse condivise.
  • Deadlock: Situazioni in cui due o più thread si aspettano a vicenda, risultando in uno stallo.
  • Starvation: Quando a un thread viene continuamente negato l'accesso alle risorse e non riesce a progredire.

Per superare queste sfide, Java mette a disposizione diversi strumenti, tra cui il pacchetto java.util.concurrent.

Esempio Pratico

L'esempio seguente dimostra la creazione e il controllo dei thread utilizzando la classe Thread:

package com.caffeinealgorithm.programaremjava;

public class ClasseThread {
  private Thread attivita;

  public void Run() {
    attivita = new Thread(this::eseguiAttivita);
    attivita.start();

    for (int indice = 1; indice <= 5; indice++) {
      System.out.printf("Run(): #%d\n", indice);

      try {
        Thread.sleep(1000);
      }
      catch (InterruptedException eccezione) {
        System.out.println(eccezione);
      }
    }

    System.out.println("L'attività Run() è terminata.");

    try {
      attivita.join();
    }
    catch (InterruptedException eccezione) {
      System.out.println(eccezione);
    }

    System.out.println("L'attività eseguiAttivita() è terminata.");
  }

  private void eseguiAttivita() {
    for (int indice = 1; indice <= 10; indice++) {
      System.out.printf("eseguiAttivita(): #%d\n", indice);

      try {
        Thread.sleep(1000);
      }
      catch (InterruptedException eccezione) {
        System.out.println(eccezione);
      }
    }
  }
}

/*
  Run(): #1
  eseguiAttivita(): #1
  Run(): #2
  eseguiAttivita(): #2
  Run(): #3
  eseguiAttivita(): #3
  Run(): #4
  eseguiAttivita(): #4
  Run(): #5
  eseguiAttivita(): #5
  L'attività Run() è terminata.
  eseguiAttivita(): #6
  eseguiAttivita(): #7
  eseguiAttivita(): #8
  eseguiAttivita(): #9
  eseguiAttivita(): #10
  L'attività eseguiAttivita() è terminata.
*/

Conclusione

La classe Thread è uno strumento essenziale per qualsiasi sviluppatore Java che voglia sfruttare la potenza della programmazione multithread. Comprenderne i metodi, i vantaggi e le sfide è fondamentale per creare applicazioni robuste, reattive ed efficienti.

Happy coding!