Il modello di concorrenza strutturata
Trattare le attività correlate come un'unità
Il modello di concorrenza strutturata è una lezione Java Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Java Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Java Academy include 4 lezioni in totale.
Che cos'è la concorrenza strutturata
La concorrenza strutturata (JEP 453, in anteprima) tratta un gruppo di task concorrenti correlati come un'unica unità di lavoro.
Se il task padre si suddivide in subtask, tutti questi devono essere completati prima che il padre prosegua, proprio come avviene con l'ambito di un blocco nel codice ordinario.
Il problema che risolve
Con gli executor tradizionali, un task avviato può sopravvivere al proprio creatore, rimanere in sospeso o essere dimenticato. Gli errori in un ramo possono passare inosservati mentre gli altri continuano a essere eseguiti.
Questo porta a perdite di thread, attività orfane e una gestione degli errori difficile da comprendere.
I task come albero
La concorrenza strutturata impone una relazione padre-figlio. I subtask formano un albero la cui radice è il task che li ha avviati.
- Un subtask non può sopravvivere all'ambito del proprio padre
- Il padre attende il completamento di tutti i figli
- La cancellazione si propaga lungo l'albero
Rispecchiare il codice sequenziale
L'idea fondamentale è che il codice concorrente dovrebbe essere leggibile come codice sequenziale. Si apre un ambito, si suddivide il lavoro e l'ambito viene chiuso solo dopo che tutto il lavoro è stato ricongiunto.
In questo modo i cicli di vita risultano evidenti ed è più facile ragionare sugli errori.
Il vecchio approccio non strutturato
Ecco un approccio familiare ma non strutturato che utilizza un executor semplice. Funziona, ma nulla garantisce che i due future abbiano un ciclo di vita coordinato.
import java.util.concurrent.*;
public class Main {
public static void main(String[] args) throws Exception {
try (ExecutorService exec = Executors.newVirtualThreadPerTaskExecutor()) {
Future<String> user = exec.submit(() -> "Ada");
Future<Integer> order = exec.submit(() -> 7);
System.out.println(user.get() + " has " + order.get() + " orders");
}
}
}Perché il coordinamento è importante
Nell'esempio precedente, se il recupero dell'utente fallisce, il task dell'ordine continua a essere eseguito inutilmente. Dovete annullarlo manualmente e gestire le eccezioni di ogni chiamata a get().
La concorrenza strutturata automatizza questo coordinamento.
Stato di anteprima
La concorrenza strutturata è disponibile come API in anteprima nel package java.util.concurrent. Per utilizzarla, compilate ed eseguite il programma con --enable-preview.
La classe centrale è StructuredTaskScope, che verrà trattata nella prossima lezione.
Garanzie sulla durata
All'interno di uno scope strutturato:
- Tutte le sottoattività vengono completate, falliscono o vengono annullate prima dell'uscita dallo scope
- Nessuna sottoattività continua a essere eseguita in background al di fuori dello scope
- Lo stack delle chiamate riflette la gerarchia effettiva delle attività nei dump dei thread
Vantaggio in termini di osservabilità
Poiché l'albero delle sottoattività è esplicito, gli strumenti del JDK possono visualizzarlo. Un thread dump raggruppa le sottoattività sotto il rispettivo scope padre, rendendo la diagnosi molto più chiara rispetto a thread di pool sparsi.
Si abbina bene ai thread virtuali
Ogni sottoattività in uno scope strutturato viene eseguita per impostazione predefinita sul proprio thread virtuale. È il costo ridotto dei thread virtuali a rendere pratico distribuire il lavoro tra molte sottoattività.
Le due funzionalità sono state progettate per lavorare insieme.
Modello mentale
Pensi a uno scope strutturato come a un blocco try-with-resources per la concorrenza: lo apre, esegue il fork del lavoro, attende con join e poi lo chiude. La parentesi graffa di chiusura garantisce che non rimanga nulla in esecuzione.
Verifica rapida
Verifichi la sua comprensione del principio fondamentale.
Riepilogo
Ha conosciuto il modello della concorrenza strutturata:
- Le attività correlate formano un albero vincolato alla durata di uno scope
- Il codice concorrente si legge come codice sequenziale
- È un'API in anteprima che richiede
--enable-preview - Si abbina naturalmente ai thread virtuali
Prossimo argomento: l'API StructuredTaskScope.
Domande Frequenti
La lezione «Il modello di concorrenza strutturata» è gratuita?
Sì — il testo completo di «Il modello di concorrenza strutturata» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Java Academy, passa a CoddyKit PRO. Il corso Java Academy include 4 lezioni in totale.
Cosa imparerò in «Il modello di concorrenza strutturata»?
Trattare le attività correlate come un'unità Eserciti Java Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Java Academy?
Non è richiesta alcuna esperienza precedente. Java Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.
Quanto tempo richiede la lezione «Il modello di concorrenza strutturata»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Java Academy?
Sì. Ogni lezione Java Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Il modello di concorrenza strutturata
- StructuredTaskScope
- Arresto in caso di errore e successo
- Gestione degli errori e annullamento