In qualità di ingegnere di back-end, affrontiamo situazioni per elaborare i dati in modo asincrono. Oggi vediamo come è fatto in java e vari modi per farlo.

Thread

Il componente molto semplice ma così potente della concorrenza Java è Thread. Il Thread di Java è in realtà associato al Thread del Sistema Operativo. Il modo molto semplice per creare un Thread è estendendolo e sovrascrivendo il run :

L’avvio del thread provoca il run() da chiamare.
Puoi chiedere; sì, Thread ha molti altri metodi che possono essere ignorati:

  • Nella maggior parte dei casi, non vogliamo sovrascrivere altri metodi del thread.
  • Una volta esteso il Thread class, la classe in estensione perde la sua capacità di estendersi ulteriormente poiché Java non supporta eredità multiple.
  • Ogni thread ha il suo oggetto quando lo estendiamo e non è buono per la salute della memoria quando ce ne sono tonnellate Objects of the extended Thread creato.

Java risolve questi problemi con l’interfaccia Runnable. Infatti, Thread ha un metodo sovraccarico che accetta Runnable.

Runnable

Runnable è un’interfaccia che ha un solo metodo: run(). Sì, Runnable è un’interfaccia funzionale e la sua istanza può essere creata con la funzione lambda. Eppure è un modo semplice per farlo; per cose complesse, potremmo volerlo implementare. Vedi la differenza qui. Riguarda il requisito:

Sebbene Runnable abbia un run(), non è un Thread ma solo una classe Java finché non viene preso il controllo da (passato a) Thread. L’avvio del thread provoca l’oggetto eseguibile run() da chiamare.

Sì, Java l’ha risolto nella versione 1.5 ed è Callable.

Callable<V>

Callable è un’interfaccia generica. Come mai? Esegui questo comando del valore restituito come generico esegui questo comando. Callable è anche un’interfaccia funzionale e call() è l’unico metodo, un metodo senza argomenti che genera un’eccezione e restituisce generico eseguire questo valore di comando.

L’implementazione di Callable è molto simile a Runnable:

Vedi qui, la chiamata elabora i dati e restituisce un valore che può essere raccolto dopo l’esecuzione. Ma c’è una grande differenza nell’invocarlo? Noi usiamo ExecutorService invocare e Future per trattenere il risultato. Parliamo del perché.

Come puoi vedere, non esiste un comportamento controllato di creazione ed esecuzione dei thread (anche eseguibili o richiamabili). Potremmo voler controllare il numero di thread in esecuzione alla volta come ciascuno di essi associato ai thread del sistema operativo. Il numero di thread che eseguiamo dovrebbe essere inferiore al numero di core CPU disponibili. Tutti insieme, Java lo risolve ExecutorService interfaccia.
Sopra è un articolo informativo su Programmazione asincrona in Java: parte I.
Sentiti libero di contattarci tramite la sezione commenti, in caso di domande relative alle istruzioni che abbiamo condiviso sopra.