Tarkastellaan joitakin muita eroja Threadin ja Runnablein välillä alla olevan vertailukaavion avulla:
Vertailukaavio
Vertailun perusteet | Lanka | runnable |
---|---|---|
perustiedot | Jokainen kierre luo ainutlaatuisen objektin ja liittyy siihen. | Useilla langoilla on samat objektit. |
Muisti | Koska jokainen kierre luo yksilöllisen objektin, tarvitaan enemmän muistia. | Koska useilla säikeillä on sama objekti, käytetään vähemmän muistia. |
jatkamisesta | Java: ssa ei sallita useita perintöjä, minkä jälkeen luokka-luokan laajentamisen jälkeen se ei voi laajentaa mitään muuta luokkaa. | Jos luokka määrittelee Runnable-käyttöliittymää toteuttavan langan, sillä on mahdollisuus laajentaa yhtä luokkaa. |
Käyttää | Käyttäjän on laajennettava langan luokkaa vain, jos se haluaa ohittaa muut menetelmät Thread-luokassa. | Jos haluat vain erikoistua juoksumenetelmään, Runnable-sovellus on parempi vaihtoehto. |
kytkentä | Laajentuva kierre-luokka tuo tiukan kytkennän, koska luokka sisältää Thread-luokan koodin ja myös langalle osoitetun työn | Runnable-käyttöliittymän käyttöönotto tuo löysän kytkennän, koska Thread-koodi on erillinen lomake Threads-työssä. |
Kierteen luokka
Lanka on java.lang- paketin luokka. Thread-luokka laajentaa objektiluokkaa ja toteuttaa Runnable- rajapintoja. Thread-luokassa on konstruktoreita ja menetelmiä langan luomiseksi ja käyttämiseksi. Kun luot useita säikeitä, jokainen säiö luo ainutlaatuisen objektin ja liittyy siihen. Jos luot kierteen, joka ulottuu Thread-luokkaan, et voi laajentaa mitään muuta luokkaa, koska java ei tue useita perintöjä. Niinpä, sinun kannattaa pidentää Thread-luokkaa vain, jos haluat myös ohittaa joitakin Thread-luokan menetelmiä. Katsotaanpa esimerkkiä langan luomisesta, joka laajentaa langanluokan.
/ * Langan määrittäminen * / Class Mythread laajentaa Thread {/ * -teoksen kierteen * / public void run () {for (int i = 0; i <10; i ++) {System.Out.Println ("Child Thread" ); }} Luokka mainThread {/ * pääkierre * / public static void main (String args []) {Mythread mt = uusi Mythread (); / * pääkierre loi lapsilangan * / mt.start (); varten (int i = 0; i <10; i ++) {System.Out.Print ("Main Thread"); }}} / * Lähtö * / Pääkierre Pääkierre Pääkierre Pääkierre Lapsi Kierre Lapsi Kierre Lapsi Kierre Lapsi Kierre Pääkierre Lapsi Kierre Pääkierre Pääkierre Lapsi Kierrekierre Pääkierre Pääkierre Lapsi Kierre Lasten säike
Yllä olevassa koodissa luon luokan Mythread, joka laajentaa Thread-luokkaa ja ohittaa Thread-luokan juoksumenetelmän. Luokkaan, joka sisältää päämenetelmän, luon Mythread-luokan lankaobjektin (mt) ja kierreobjektin käyttämisen käynnistettiin start () -menetelmä. Aloitusmenetelmä aloittaa langan suorittamisen ja samanaikaisesti JVM käynnistää langan ajotavan. Nyt ohjelmassa on kaksi säiettä, joista yksi pääkierre ja toinen lankaa, jonka pääkierre luo. Molempien säikeiden toteutus tapahtuu samanaikaisesti, mutta tarkkaa tuottoa ei voida tehdä.
Määritettävän liitännän määritelmä
Runnable on java.lang- paketin käyttöliittymä. Runnable-käyttöliittymän toteuttaminen voi määrittää kierteen. Runnable-käyttöliittymässä on yksi menetelmäajo (), joka toteutetaan Runnable-liitäntää käyttävän luokan avulla. Kun päätät määrittää kierteen, joka toteuttaa Runnable-käyttöliittymän, sinulla on edelleen mahdollisuus laajentaa mitä tahansa muuta luokkaa. Kun luot useita säikeitä toteuttamalla Runnable-käyttöliittymän, jokaisella langalla on sama ajettava esiintymä. Kerro meille, miten määritellä lanka käyttämällä Runnable-liitäntää.
/ * Lankan määrittäminen * / Luokka Runnablethread toteuttaa juoksevan * / * -työn kierteen * / julkisen tyhjäkäynnin () {for (int i = 0; i <10; i ++) {System.Out.Println ("Lapsilanka" ); }} Luokka mainThread {/ * pääkierron työ * / julkinen staattinen tyhjä pää (String args []) {myytti-rt = uusi myytti (); / * pääkierre on luonut ajettavan objektin * / Thread t = new Thread (rt); / * pääkierre luo lapsilangan ja läpäisi ajettavan objektin * / t.start (); varten (int i = 0; i <10; i ++) {System.Out.Print ("Main Thread"); }}} / * Lähtö * / Pääkierre Pääkierre Pääkierre Pääkierre Lapsi Kierre Lapsi Kierre Lapsi Kierre Lapsi Kierre Pääkierre Lapsi Kierre Pääkierre Pääkierre Lapsi Kierrekierre Pääkierre Pääkierre Lapsi Kierre Lasten säike
Yllä olevassa koodissa olen luonut Runnablethread-luokan, joka toteuttaa Runnable-rajapinnan ja määrittelee langan työn toteuttamalla Runnable-käyttöliittymän () (run) -menetelmän. Sitten luon luokan, joka sisältää päämenetelmän. Päämenetelmän sisällä julistin luokan Runnablethreadin ajettavan kohteen ja välitän tämän kohteen Threadin rakentajalle samalla kun ilmoitettiin langasta. Tällä tavoin yhdistin langanobjektin (t) ajettavaan kohteeseen (rt). Sitten lankaobjekti kutsuu kierteen aloitusmenetelmän, joka edelleen kutsuu Runnablethread-luokan juoksumenetelmää. Jos minulla ei olisi ollut linkitettävää objektia Thread-objektilla, kierteiden aloitusmenetelmä olisi käyttänyt Thread-luokan juoksumenetelmää. Nyt koodissa taas on kaksi säiettä, pääkierre ja pääkierre luovat lapsilangan, jotka molemmat suoritetaan samanaikaisesti, mutta tarkkaa tuottoa ei voida koskaan tehdä.
Keskeiset erot kierteen ja ajettavan välillä Java: ssa
- Jokainen lanka, joka on luotu Thread-luokan laajentamisen avulla, luo sille ainutlaatuisen objektin ja liittyy siihen. Toisaalta jokaisella Runnable-käyttöliittymän toteuttamisella luotu säikeellä on sama ajettava esiintymä.
- Koska jokainen kierre liittyy ainutlaatuiseen objektiin, kun se luodaan laajentamalla Thread-luokkaa, tarvitaan enemmän muistia. Toisaalta jokainen Runnable-käyttöliittymän toteuttamisen yhteydessä luotu säike on sama objektitila, joten se vaatii vähemmän muistia.
- Jos laajennat Thread-luokkaa niin edelleen, voit periä minkä tahansa toisen luokan, koska Java ei salli useita perintöä, kun taas Runnable-ohjelman toteuttaminen antaa vielä luokalle mahdollisuuden periä minkä tahansa toisen luokan.
- Thread-luokkaa on laajennettava vain, jos sen täytyy ohittaa tai erikoistua joihinkin muihin Thread-luokan menetelmiin. Jos haluat vain erikoistua vain juoksumenetelmään, sinun on toteutettava ajettava käyttöliittymä.
- Thread-luokan laajentaminen tuo koodiin tiukan kytkennän, koska samaan luokkaan kuuluu kierteen koodi ja langan työ. Toisaalta Runnable-käyttöliittymä tuo koodiin löysän kytkennän, koska Thread-koodi on kierteitetystä työstä.
johtopäätös:
On suositeltavaa toteuttaa Runnable-liitäntä Thread-luokan laajentamisen sijasta. Runnable-sovelluksen avulla koodisi on löysästi kytketty, koska kierteen koodi poikkeaa luokasta, joka määrittää työn langalle. Se vaatii vähemmän muistia ja sallii myös luokan periä minkä tahansa toisen luokan.