4 načina pisanja višereznog koda na Javi

  • Peter Holmes
  • 0
  • 2269
  • 425
Oglas

Višestruki navoj je metoda pisanja koda za paralelno izvršavanje zadataka. Java je imala izvrsnu podršku za pisanje višeslojnog koda od ranih dana Java 1.0. Nedavna poboljšanja Jave povećala su načine na koji se može strukturirati kôd za uključivanje višestruke nitne u Java programe.

U ovom članku uspoređujemo nekoliko ovih opcija pa možete bolje prosuditi koju opciju koristiti za svoj sljedeći Java projekt Love GitHub? 4 razloga zašto biste trebali ugostiti svoj kod na BitBucket Love GitHub-u? 4 razloga zašto biste trebali ugostiti svoj kod na BitBucketu Morate razmišljati o tome gdje namjeravate pohraniti svoj kôd. Vjerojatno ste čuli za GitHub. To nije iznenađujuće. GitHub pojedinci i poduzeća koriste kako bi ugostili kod, surađivali na dokumentaciji ... t.

1. metoda: Proširenje klase niti

Java pruža Nit klase koja se može proširiti za implementaciju trčanje() metoda. Ova metoda run () je mjesto na kojem implementirate svoj zadatak. Kad želite započeti zadatak u njegovoj niti, možete stvoriti instancu ove klase i pozvati je na nju početak() metoda. To pokreće izvedbu niti i započinje do kraja (ili završava u iznimci).

Ovdje je jednostavna klasa niti koja samo spava u određenom intervalu kao način simulacije dugotrajne operacije.

javna klasa MyThread proširuje nit private int sleepFor; javni MyThread (int sleepFor) this.sleepFor = sleepFor;  @Override javni void run () System.out.printf ("[% s] nit započinje \ n", Thread.currentThread (). ToString ()); pokušajte Thread.sleep (this.sleepFor);  hvatanje (InterruptedException ex)  System.out.printf ("[% s] nit završava \ n", Thread.currentThread (). toString ());  

Napravite instancu ove klase Thread dajući joj nekoliko milisekundi za spavanje.

MyThread radnik = novi MyThread (sleepFor); 

Započnite izvršavanje ove radničke niti pozivanjem na metodu start (). Ova metoda vraća kontrolu pozivaču odmah, bez čekanja da se nit prekine.

worker.start (); System.out.printf ("[% s] glavna nit \ n", Thread.currentThread (). ToString ()); 

A evo i rezultata za pokretanje ovog koda. Ukazuje da se dijagnostika glavnog navoja ispisuje prije nego što se radnička nit izvrši.

[Navoj [glavni, 5, glavni]] glavni navoj [Navoj [Navoj-0,5, glavni]] navoj započinje [Konac [Navoj-0,5, glavni]] navoj završava 

Budući da nakon pokretanja radne niti nema više izjava, glavna nit čeka da radni nit završi prije nego program izađe. To omogućava radničkom niti da ispuni svoj zadatak.

Druga metoda: Upotreba instancije navoja s izvedbom

Java nudi i sučelje koje se naziva Runnable koje može provesti klasa radnika da izvrši zadatak u svojoj trčanje() metoda. Ovo je alternativni način stvaranja radničke klase, za razliku od produženja Nit klasa (gore opisano).

Slijedi implementacija radničke klase koja sada implementira Runnable umjesto produžetka Thread.

MyThread2 u javnoj klasi implementira Runnable // isto kao gore 

Prednost implementacije sučelja Runnable umjesto proširenja klase Thread je ta što klasa radnika sada može proširiti klasu specifičnu za domenu u hijerarhiji klase.

Što to znači?

Recimo, na primjer, da imate Voće klasa koja primjenjuje određene generičke karakteristike plodova. Sada želite implementirati a Papaja klasa koja je specijalizirala određene voćne karakteristike. To možete učiniti tako da imate Papaja klasa produžiti Voće klasa.

Javna klasa Voće // voćne specifičnosti ovdje javna klasa Papaya proširuje voće // prevladavanje ponašanja specifičnog za papaju ovdje 

Pretpostavimo da imate dugotrajan zadatak koji Papaya treba podržati, a koji se može izvesti u zasebnom nizu. Ovaj se slučaj može obraditi tako da klasa Papaya implementira Runnable i pruži metodu run () u kojoj se obavlja ovaj zadatak.

javna klasa Papaya proširuje Fruit implementira Runnable // poništavanje ponašanja specifičnog za papayu ovdje @Override public void run () // ovdje zahtijeva mnogo vremena.  

Kako biste otklonili radničku nit, kreirate instancu klase radnika i predate je instanci Thread pri kreiranju. Kada se aktivira metoda start () Thread, zadatak se izvršava u zasebnom nizu.

Papaya papaya = nova Papaya (); // ovdje postavite svojstva i prizovite metode papaye. Navoj niti = nova nit (papaja); thread.start (); 

A to je kratki sažetak načina korištenja Runnable-a za provedbu zadatka koji se izvršava unutar niti.

Treća metoda: Izvršiti Runnable s ExecutorService

Počevši od verzije 1.5 ExecutorService kao nova paradigma za stvaranje i upravljanje nitima unutar programa. Generalizira koncept izvođenja niti apstrahiranjem stvaranja niti.

To je zato što svoje zadatke u nizu niti možete izvoditi jednako lako kao koristeći zasebnu nit za svaki zadatak. To omogućuje vašem programu da prati i upravlja koliko niti se koristi za radničke zadatke.

Pretpostavimo da imate 100 radnih zadataka koji čekaju na izvršenje. Ako pokrenete jednu nit po radniku (kao što je prikazano gore), u programu ćete imati 100 niti što bi moglo dovesti do uskih grla drugdje u programu. Umjesto toga, ako koristite bazen niti s, recimo, 10 niti unaprijed dodijeljenih, vaše 100 zadataka izvršavat će ove niti jedna za drugom, tako da vaš program ne gladuje zbog resursa. Pored toga, ove niti niti baze podataka mogu se konfigurirati tako da se vise oko njih kako bi izvršili dodatne zadatke za vas.

Servis izvršitelja prihvaća a Runnable zadatak (objašnjeno gore) i izvršava zadatak u odgovarajuće vrijeme. podnijeti() metoda koja prihvaća zadatak Runnable vraća instancu klase koja se zove Budućnost, što pozivatelju omogućuje praćenje statusa zadatka. Posebno dobiti() metoda omogućuje pozivaocu čekanje da zadatak dovrši (i osigurava povratni kôd, ako postoji).

U primjeru u nastavku izrađujemo ExecutorService statičkom metodom newSingleThreadExecutor (), što kao što ime govori stvara jednu nit za izvršavanje zadataka. Ako je poslano više zadataka dok se jedan zadatak izvodi, ExecutorService postavlja ove zadatke u red za kasnije izvršavanje.

Izvedba Runnable koju ovdje koristimo ista je gore opisana.

ExecutorService esvc = Executors.newSingleThreadExecutor (); Izvodljivi radnik = novi MyThread2 (sleepFor); Buduća budućnost = esvc.smit (radnik); System.out.printf ("[% s] glavna nit \ n", Thread.currentThread (). ToString ()); future.get (); esvc.shutdown (); 

Imajte na umu da se ExecutorService mora ispravno isključiti kad više nije potrebna za daljnje podnošenje zadataka.

Metoda 4: Naziva se pomoću usluge ExecutorService

Počevši od verzije 1.5, Java je predstavila novo sučelje pod nazivom opozivi. Slično je starijem Runnable sučelju s razlikom što je način izvršenja (tzv poziv() umjesto trčanje()) može vratiti vrijednost. Uz to se također može proglasiti da izuzetak može se baciti.

ExecutorService također može prihvatiti zadatke implementirane kao opozivi i vraća a Budućnost s vrijednosti vraćenom metodom po završetku.

Evo primjera Mango klase koja proširuje Voće klasa definirana ranije i provodi opozivi sučelje. Skupi i dugotrajni zadatak obavlja se u okviru poziv() način.

javna klasa Mango proširuje Fruit implementira Callable javni Integer call () // skupo računanje ovdje vraća novi Integer (0);  

A ovdje je kôd za podnošenje instancije klase u ExecutorService. Donji kôd također čeka da zadatak dovrši i ispisuje njegovu povratnu vrijednost.

ExecutorService esvc = Executors.newSingleThreadExecutor (); MyCallable radnik = novi MyCallable (sleepFor); Buduća budućnost = esvc.smit (radnik); System.out.printf ("[% s] glavna nit \ n", Thread.currentThread (). ToString ()); System.out.println ("Zadatak se vratio:" + future.get ()); esvc.shutdown (); 

Što vam je draže?

U ovom smo članku naučili nekoliko metoda pisanja višedijelnog koda na Javu. To uključuje:

  1. Produljenje Nit klasa je najosnovnija i dostupna je od Java 1.0.
  2. Ako imate klasu koja mora proširiti neku drugu klasu u hijerarhiji klase, tada možete implementirati Runnable sučelje.
  3. Moderniji objekt za stvaranje niti je ExecutorService koja može prihvatiti instancu Runnable kao zadatak pokretanja. Prednost ove metode je u tome što možete koristiti niz niti za izvršavanje zadatka. Povez s nitima pomaže u očuvanju resursa ponovnom uporabom niti.
  4. Konačno, također možete stvoriti zadatak implementacijom opozivi sučelje i predavanje zadatka ExecutorService.

Koju biste od sljedećih opcija smatrali da ćete koristiti u svom sljedećem projektu? Javite nam u komentarima u nastavku.




Još ne komentari

O modernoj tehnologiji, jednostavnoj i pristupačnoj.
Vaš vodič u svijetu moderne tehnologije. Naučite kako koristiti tehnologije i uređaje koji nas okružuju svaki dan i naučite kako otkriti zanimljivosti na Internetu.