Programiranje

Uvod v niti Java

Ta članek, eden prvih, ki ga je objavil JavaWorld, opisuje, kako se niti izvajajo v programskem jeziku Java, začenši s splošnim pregledom niti.

Preprosto povedano, a nit je pot izvajanja programa. Večina danes napisanih programov deluje kot ena nit, kar povzroča težave, kadar je treba hkrati zgoditi več dogodkov ali dejanj. Recimo, da na primer program ne more risati slik med branjem tipk. Program mora biti v celoti pozoren na vnos s tipkovnice, ki nima zmožnosti obdelave več dogodkov hkrati. Idealna rešitev te težave je nemoteno izvajanje dveh ali več odsekov programa hkrati. Niti nam to omogočajo.

Spoznavanje niti Java

Ta članek je del arhiva tehnične vsebine JavaWorld. Glejte naslednje, če želite izvedeti več o nitih Java in sočasnosti:

Razumevanje niti Java (Java 101 serija, 2002):

  • 1. del: Predstavljanje niti in izvedljivih datotek
  • 2. del: Sinhronizacija niti
  • 3. del: Načrtovanje niti in čakanje / obveščanje
  • 4. del: Skupine niti in volatilnost

Povezani članki

  • Java s hipernitnimi nitmi: uporaba Java Concurrency API (2006)
  • Boljši monitorji za večnitne programe (2007)
  • Razumevanje sočasnosti igralcev, 1. del (2009)
  • Zaznavanje in ravnanje z visečimi nitmi (2011)

Preverite tudi JavaWorld zemljevid strani in iskalnik.

Večnitne aplikacije zagotavljajo svojo močno moč tako, da hkrati izvajajo številne niti v enem programu. Z logičnega vidika večnitnost pomeni, da je mogoče hkrati izvajati več vrstic enega programa, vendar to ni isto kot dvakrat zagnati program in reči, da se istočasno izvaja več vrstic programa čas. V tem primeru operacijski sistem obravnava programe kot dva ločena in ločena procesa. V Unixu forking proces ustvari podrejeni proces z drugačnim naslovnim prostorom za kodo in podatke. Vendar vilice () ustvarja veliko režijskih stroškov za operacijski sistem, zaradi česar je zelo zahtevna CPU operacija. Če namesto tega zaženete nit, se ustvari učinkovita pot izvajanja, pri čemer se prvotno podatkovno področje še vedno deli z nadrejenim. Ideja skupne rabe podatkovnega področja je zelo koristna, vendar odpira nekaj zaskrbljujočih področij, o katerih bomo razpravljali kasneje.

Ustvarjanje niti

Ustvarjalci Jave so prijazno oblikovali dva načina ustvarjanja niti: izvajanje vmesnika in razširitev razreda. Razširitev razreda je način, kako Java podeduje metode in spremenljivke od nadrejenega razreda. V tem primeru je mogoče razširiti ali podedovati samo en nadrejeni razred. To omejitev v Javi je mogoče premagati z uporabo vmesnikov, kar je najpogostejši način za ustvarjanje niti. (Upoštevajte, da dejanje dedovanja zgolj omogoča, da se razred zažene kot nit. Od razreda je odvisno začetek () izvedba itd.)

Vmesniki programerjem omogočajo, da postavijo temelje razreda. Uporabljajo se za oblikovanje zahtev za niz razredov, ki jih je treba izvesti. Vmesnik nastavi vse, razred ali razredi, ki izvajajo vmesnik, pa vse naredijo. Različni sklopi razredov, ki izvajajo vmesnik, morajo upoštevati enaka pravila.

Med razredom in vmesnikom je nekaj razlik. Prvič, vmesnik lahko vsebuje samo abstraktne metode in / ali statične končne spremenljivke (konstante). Razredi pa lahko izvajajo metode in vsebujejo spremenljivke, ki niso konstante. Drugič, vmesnik ne more izvajati nobenih metod. Razred, ki izvaja vmesnik, mora izvajati vse metode, definirane v tem vmesniku. Vmesnik ima možnost razširitve iz drugih vmesnikov in se (za razliko od razredov) lahko razširi iz več vmesnikov. Poleg tega vmesnika ni mogoče ustvariti z novim operaterjem; na primer, Runnable a = new Runnable (); ni dovoljeno.

Prvi način ustvarjanja niti je, da preprosto razširimo od Navoj razred. Naredite to le, če razreda, ki ga želite izvesti kot nit, ni treba nikoli razširiti iz drugega razreda. The Navoj razred je definiran v paketu java.lang, ki ga je treba uvoziti, da bodo naši razredi seznanjeni z njegovo definicijo.

uvoz java.lang. *; javni števec razširi nit {public void run () {....}}

Zgornji primer ustvari nov razred Števec ki razširja Navoj razred in preglasi Thread.run () metoda za lastno izvajanje. The teči () metoda, kjer je vse delo Števec nit razreda je narejena. Isti razred lahko ustvarite z izvajanjem Runnable:

uvoz java.lang. *; javni števec števca izvaja Runnable {Thread T; javni void run () {....}}

Tu povzetek teči () metoda je definirana v vmesniku Runnable in se izvaja. Upoštevajte, da imamo primerek Navoj razred kot spremenljivka Števec razred. Edina razlika med obema metodama je v tem, da je z izvajanjem Runnable večja prilagodljivost pri ustvarjanju razreda Števec. V zgornjem primeru še vedno obstaja možnost razširitve Števec razred, če je to potrebno. Večina razredov, ki jih je treba zagnati kot nit, bo izvedla možnost Runnable, saj verjetno širijo nekatere druge funkcije iz drugega razreda.

Ne mislite, da vmesnik Runnable dejansko dela, ko se nit izvaja. To je zgolj razred, ki je bil ustvarjen, da bi dal idejo o oblikovanju Navoj razred. Pravzaprav je zelo majhna in vsebuje samo eno abstraktno metodo. Tu je definicija vmesnika Runnable neposredno iz vira Java:

paket java.lang; javni vmesnik Runnable {javni povzetek void run (); }

To je vse, kar je na voljo v vmesniku Runnable. Vmesnik ponuja samo zasnovo, na kateri naj se izvajajo razredi. V primeru vmesnika Runnable prisili definicijo samo teči () metoda. Zato večino dela opravimo v Navoj razred. Podrobnejši pogled na odsek v definiciji Navoj predavanje bo predstavilo, kaj se v resnici dogaja:

javni razred Thread izvaja Runnable {... public void run () {if (target! = null) {target.run (); }} ...}

Iz zgornjega delčka kode je razvidno, da razred Thread izvaja tudi vmesnik Runnable. Navoj.teči () preveri, ali ciljni razred (razred, ki se bo izvajal kot nit), ni enak nič, nato pa izvede teči () metoda cilja. Ko se to zgodi, teči () metoda cilja se bo izvajala kot lastna nit.

Zagon in ustavitev

Ker so zdaj očitni različni načini za ustvarjanje primerka niti, bomo razpravljali o izvajanju niti, ki se začne z načini, kako jih zagnati in ustaviti z uporabo majhnega programčka, ki vsebuje nit, da ponazorimo mehaniko:

Primer in izvorna koda CounterThread

Zgornji programček bo začel šteti od 0, tako da bo prikazal svoj izhod na zaslon in konzolo. Že hiter pogled lahko da vtis, da bo program začel šteti in prikazoval vsako številko, vendar to ni tako. Natančnejši pregled izvedbe tega apleta bo razkril njegovo resnično identiteto.

V tem primeru je CounterThread class je bil prisiljen izvajati Runnable, ker je razširil razred Applet. Kot pri vseh apletih je tudi v() metoda se najprej izvede. V v(), je spremenljivka Count inicializirana na nič in nov primerek Navoj razred je ustvarjen. Mimogrede to do Navoj konstruktorja, nova nit bo vedela, kateri objekt naj se zažene. V tem primeru to je sklic na CounterThread. Ko je nit ustvarjena, jo je treba zagnati. Klic k začetek () bo poklical tarčo teči () metoda, ki je CounterThread.teči (). Klic k začetek () se bo takoj vrnil in nit se bo začela izvajati hkrati. Upoštevajte, da teči () metoda je neskončna zanka. Neskončno je, ker nekoč teči () metoda izstopi, nit preneha izvajati. The teči () metoda bo povečala spremenljivko Count, spala 10 milisekund in poslala zahtevo za osvežitev zaslona programčka.

Upoštevajte, da je pomembno, da spite nekje v niti. V nasprotnem primeru bo nit porabila ves čas procesorja za postopek in ne bo dovolila izvajanja nobenih drugih metod, kot so niti. Drug način za prenehanje izvajanja niti je klic stop () metoda. V tem primeru se nit ustavi, ko pritisnete miško, medtem ko je kazalec v apletu. Odvisno od hitrosti računalnika, na katerem deluje programček, ne bo prikazana vsaka številka, ker povečanje poteka neodvisno od slikanja programčka. Programa ni mogoče osvežiti na vsako zahtevo, zato bo OS postavil zahteve v čakalno vrsto in zaporedne zahteve za osvežitev bodo zadovoljene z eno osvežitvijo. Medtem ko so osvežitve v čakalni vrsti, se število še povečuje, vendar ni prikazano.

Začasna ustavitev in nadaljevanje

Ko se nit ustavi, je ni več mogoče znova zagnati z začetek () ukaz, saj stop () bo zaključil izvajanje niti. Namesto tega lahko zaustavite izvajanje niti z spanje () metoda. Nit bo v določenem časovnem obdobju spala in se nato začela izvajati, ko bo dosežena časovna omejitev. Vendar to ni idealno, če je treba nit zagnati ob določenem dogodku. V tem primeru je suspend () metoda omogoča, da nit začasno preneha izvajati in Nadaljuj() metoda omogoča, da se obešeni navoj začne znova. Naslednji programček prikazuje zgornji primer, prirejen za začasno ustavitev in nadaljevanje programa.

javni razred CounterThread2 razširja Applet implementira Runnable {Thread t; int Count; logična vrednost je začasno ustavljena; javna logična vrednost mouseDown (dogodek e, int x, int y) {if (začasno ustavljeno) t.resume (); sicer t.suspend (); začasno =! začasno; vrni res; } ...}

Primer in izvorna koda CounterThread2

Da bi spremljali trenutno stanje programčka, logično spremenljivko začasno ustavljeno se uporablja. Razlikovanje različnih stanj programčka je pomembno, ker nekatere metode vržejo izjeme, če so poklicane v napačnem stanju. Na primer, če se je programček zagnal in ustavil, se izvrši začetek () metoda vrže IllegalThreadStateException izjema.

$config[zx-auto] not found$config[zx-overlay] not found