Backend-insinöörinä kohtaamme tilanteita, joissa dataa käsitellään asynkronisesti. Tänään katsotaan kuinka se tehdään javassa ja eri tavoilla tehdä se.

Thread

Java-samanaikaisuuden hyvin yksinkertainen mutta niin tehokas komponentti on Thread. Java-säie liittyy itse asiassa käyttöjärjestelmän säikeeseen. Hyvin yksinkertainen tapa luoda a Thread on laajentamalla sitä ja ohittamalla run :

Langan aloittaminen aiheuttaa run() tulla kutsutuksi.
Voit kysyä; kyllä, säikeessä on monia muita menetelmiä, jotka voidaan ohittaa:

  • Useimmissa tapauksissa emme halua ohittaa muita säikeen menetelmiä.
  • Kun pidennetään Thread luokkaa, laajeneva luokka menettää kykynsä laajentaa edelleen, koska Java ei tue useita perintöjä.
  • Jokaisella säikeellä on oma objektinsa, kun jatkamme sitä, eikä se ole hyvä muistin terveydelle, kun niitä on tonnia Objects of the extended Thread luotu.

Java korjaa nämä ongelmat Runnable-käyttöliittymällä. Itse asiassa, Thread on ylikuormitettu menetelmä, joka vie Runnable.

Runnable

Runnable on käyttöliittymä, jolla on vain yksi menetelmä: run(). Kyllä, Runnable on toimiva käyttöliittymä ja sen ilmentymä voidaan luoda lambda-funktiolla. Se on kuitenkin helppo tapa tehdä tämä; monimutkaisissa asioissa saatamme haluta toteuttaa sen. Katso ero tästä. Kaikki riippuu vaatimuksesta:

Vaikka Runnablella on run(), se ei ole säie, vaan vain Java-luokka, kunnes Thread ottaa sen haltuunsa (siirtää sille). Säikeen aloitus aiheuttaa ajettavan objektin run() tulla kutsutuksi.

Jep, Java ratkaisi sen versiossa 1.5, ja se on Callable.

Callable<V>

Callable on yleinen käyttöliittymä. Miksi? Suorita tämä palautusarvon komento yleisenä suorita tämä komento. Callable on liian toimiva käyttöliittymä ja call() on ainoa menetelmä, ei-argumenttimenetelmä, joka heittää Exceptionin ja palauttaa yleisen suorituksen tämän komennon arvon.

Toteutus Callable on hyvin samanlainen kuin Runnable:

Katso tästä, puhelu käsittelee tiedot ja palauttaa arvon, joka voidaan kerätä suorituksen jälkeen. Mutta onko sen vetoamisessa suuri ero? Käytämme ExecutorService kutsua ja Future pitämään tulosta. Puhutaanpa miksi.

Kuten näet, säikeiden luomisessa ja suorittamisessa ei ole kontrolloitua toimintaa (myös ajettava tai kutsuttava). Haluamme ehkä hallita kerralla käynnissä olevien säikeiden määrää, koska jokainen niistä liittyy käyttöjärjestelmän säikeisiin. Käyttämiemme säikeiden lukumäärän tulisi olla pienempi kuin käytettävissä olevien prosessoriytimien lukumäärä. Kaiken kaikkiaan Java ratkaisee sen ExecutorService käyttöliittymä.
Yllä on informatiivinen artikkeli aiheesta Async-ohjelmointi Javassa: Osa I.
Ota rohkeasti yhteyttä kommenttiosion kautta, jos sinulla on kysyttävää yllä jakamistamme ohjeista.