Višenitnost i sinkronizacija smatraju se tipičnim poglavljem u java programiranju. U tvrtkama koje se bave razvojem igara uglavnom se postavljaju pitanja na intervjuu vezana uz višenitnost. Dolje je naveden popis često postavljanih pitanja o intervjuu za višenitnost i paralelnost u Javi.
Višenitna pitanja za intervju
1) Što je višenitnost?
Multithreading je proces izvršavanja više niti istovremeno. Multithreading se koristi za postizanje multitaskinga. Troši manje memorije i daje brzu i učinkovitu izvedbu. Njegove glavne prednosti su:
- Niti dijele isti adresni prostor.
- Konac je lagan.
- Troškovi komunikacije između procesa su niski.
2) Što je nit?
Nit je lagani podproces. To je zaseban put izvršenja jer se svaka nit izvodi u različitom okviru stoga. Proces može sadržavati više niti. Niti dijele resurse procesa, ali ipak se izvršavaju neovisno.
Više detalja.3) Razlikujete proces i nit?
Postoje sljedeće razlike između procesa i niti.
- Program u izvođenju naziva se proces dok; Nit je podskup procesa
- Procesi su neovisni, dok su niti podskup procesa.
- Procesi imaju različite adresne prostore u memoriji, dok niti sadrže zajednički adresni prostor.
- Prebacivanje konteksta je brže između niti u usporedbi s procesima.
- Komunikacija između procesa je sporija i skuplja od komunikacije između niti.
- Svaka promjena u nadređenom procesu ne utječe na podređeni proces, dok promjene u roditeljskoj niti mogu utjecati na podređenu nit.
4) Što podrazumijevate pod komunikacijom između niti?
- Proces komunikacije između sinkroniziranih niti naziva se komunikacija između niti.
- Komunikacija između niti se koristi za izbjegavanje anketiranja niti u Javi.
- Nit je zaustavljena u svom kritičnom odjeljku, a drugoj je niti dozvoljeno da uđe (ili zaključa) u isti kritični odjeljak kako bi se izvršila.
- Može se dobiti metodama wait(), notify() i notifyAll().
5) Koja je svrha metode wait() u Javi?
Way() metodu pruža klasa Object u Javi. Ova se metoda koristi za komunikaciju između niti u Javi. Java.lang.Object.wait() se koristi za pauziranje trenutne niti i čekanje dok druga nit ne pozove metodu notify() ili notifyAll(). Njegova sintaksa je dana u nastavku.
javno konačno void čekanje()
6) Zašto se metoda wait() mora pozvati iz sinkroniziranog bloka?
Moramo pozvati metodu čekanja inače će izbaciti java.lang.IllegalMonitorStateException izuzetak. Štoviše, potrebna nam je metoda wait() za međunitnu komunikaciju s notify() i notifyAll(). Stoga mora biti prisutan u sinkroniziranom bloku za pravilnu i točnu komunikaciju.
7) Koje su prednosti višenitnosti?
Višenitno programiranje ima sljedeće prednosti:
- Multithreading omogućuje aplikaciji/programu da uvijek reagira na unos, čak i da se već izvodi s nekim pozadinskim zadacima
- Višenitnost omogućuje brže izvršavanje zadataka jer se niti izvršavaju neovisno.
- Višenitnost omogućuje bolju iskorištenost predmemorije jer niti dijele zajedničke memorijske resurse.
- Multithreading smanjuje broj potrebnih poslužitelja budući da jedan poslužitelj može izvršavati više niti istovremeno.
8) Koja su stanja u životnom ciklusu niti?
Nit može imati jedno od sljedećih stanja tijekom svog životnog vijeka:
9) Koja je razlika između preventivnog rasporeda i vremenskog odsječka?
Pod preventivnim raspoređivanjem, zadatak s najvišim prioritetom se izvršava sve dok ne uđe u stanje čekanja ili mrtvo stanje ili dok ne dođe do zadatka višeg prioriteta. Pod vremenskim odsječkom, zadatak se izvršava unaprijed definirani vremenski odsječak, a zatim ponovno ulazi u skup spremnih zadataka. Planer zatim određuje koji zadatak treba izvršiti sljedeći, na temelju prioriteta i drugih čimbenika.
10) Što je promjena konteksta?
U preklapanju konteksta stanje procesa (ili niti) pohranjuje se tako da se može vratiti i kasnije nastaviti s izvođenjem s iste točke. Prebacivanje konteksta omogućuje da više procesa dijeli isti CPU.
11) Razlikujete između klase Thread i Runnable sučelja za stvaranje niti?
Nit se može stvoriti na dva načina.
- Proširenjem klase Thread
- Implementacijom Runnable sučelja
Međutim, osnovne razlike između oba načina navedene su u nastavku:
- Proširivanjem klase Thread ne možemo proširiti nijednu drugu klasu, jer Java ne dopušta višestruko nasljeđivanje tijekom implementacije Runnable sučelja; također možemo proširiti drugu osnovnu klasu (ako je potrebno).
- Proširivanjem klase Thread, svaka nit stvara jedinstveni objekt i pridružuje se s njim tijekom implementacije Runnable sučelja; više niti dijeli isti objekt
- Klasa niti pruža različite ugrađene metode kao što su getPriority(), isAlive i mnoge druge, dok sučelje Runnable pruža jednu metodu, tj. run().
12) Što znači join() metoda?
Metoda join() čeka da nit umre. Drugim riječima, uzrokuje prestanak izvršavanja trenutno pokrenutih niti dok nit kojoj se pridružuje ne dovrši svoj zadatak. Metoda Join je preopterećena u klasi Thread na sljedeće načine.
- public void join() baca InterruptedException
- public void join (duge milisekunde) izbacuje InterruptedException
13) Opišite svrhu i rad metode sleep().
Metoda sleep() u Javi koristi se za blokiranje niti na određeno vrijeme, što znači da pauzira izvršavanje niti na određeno vrijeme. Postoje dvije metode za to.
Sintaksa:
javascript za petlju
- public static void sleep (duge milisekunde) izbacuje InterruptedException
- public static void sleep (duge milisekunde, int nanos) izbacuje InterruptedException
Rad sleep() metode
Kada pozovemo metodu sleep(), ona pauzira izvršavanje trenutne niti na zadano vrijeme i daje prioritet drugoj niti (ako je dostupna). Štoviše, kada vrijeme čekanja završi, prethodna nit ponovno mijenja svoje stanje iz stanja čekanja u stanje pokretanja i dolazi u stanje izvođenja, a cijeli proces tako radi sve dok se izvođenje ne završi.
14) Koja je razlika između metode wait() i sleep()?
čekati() | spavati() |
---|---|
1) Metoda wait() definirana je u klasi Object. | Metoda sleep() definirana je u klasi Thread. |
2) Metoda wait() oslobađa zaključavanje. | Metoda sleep() ne oslobađa zaključavanje. |
15) Je li moguće pokrenuti nit dva puta?
Ne, ne možemo ponovno pokrenuti nit, jer kada se nit pokrene i izvrši, prelazi u stanje mrtvo. Stoga, ako dvaput pokušamo pokrenuti nit, to će dati runtimeException 'java.lang.IllegalThreadStateException'. Razmotrite sljedeći primjer.
public class Multithread1 extends Thread { public void run() { try { System.out.println('thread is executing now........'); } catch(Exception e) { } } public static void main (String[] args) { Multithread1 m1= new Multithread1(); m1.start(); m1.start(); } }
Izlaz
thread is executing now........ Exception in thread 'main' java.lang.IllegalThreadStateException at java.lang.Thread.start(Thread.java:708) at Multithread1.main(Multithread1.java:13)Više detalja.
16) Možemo li pozvati metodu run() umjesto start()?
Da, izravno pozivanje metode run() je važeće, ali neće raditi kao nit, već će raditi kao normalan objekt. Neće biti promjene konteksta između niti. Kada pozovemo metodu start(), ona interno poziva metodu run(), koja stvara novi stog za nit dok izravno pozivanje run() neće stvoriti novi stog.
Više detalja.17) Što je s daemon nitima?
Daemon niti su niti niskog prioriteta koje pružaju pozadinsku podršku i usluge korisničkim nitima. Daemon nit se automatski prekida od strane JVM-a ako program ostane samo s daemon niti, a sve ostale korisničke niti su prekinute/umrle. U klasi Thread dostupne su dvije metode za demonsku nit:
18) Možemo li korisničku nit učiniti demonskom nitom ako je nit pokrenuta?
Ne, ako to učinite, izbacit će IllegalThreadStateException. Prema tome, demonsku nit možemo stvoriti samo prije pokretanja niti.
class Testdaemon1 extends Thread{ public void run(){ System.out.println('Running thread is daemon...'); } public static void main (String[] args) { Testdaemon1 td= new Testdaemon1(); td.start(); setDaemon(true);// It will throw the exception: td. } }
Izlaz
Running thread is daemon... Exception in thread 'main' java.lang.IllegalThreadStateException at java.lang.Thread.setDaemon(Thread.java:1359) at Testdaemon1.main(Testdaemon1.java:8)Više detalja.
19) Što je kuka za isključivanje?
Zakačka za isključivanje je nit koja se implicitno poziva prije nego što se JVM isključi. Tako da ga možemo koristiti za čišćenje resursa ili spremanje stanja kada se JVM normalno ili iznenada isključi. Možemo dodati kuku za isključivanje korištenjem sljedeće metode:
public�void�addShutdownHook(Thread�hook){}�� Runtime r=Runtime.getRuntime(); r.addShutdownHook(new MyThread());
Neke važne točke o kukicama za isključivanje su:
- Priključnice za isključivanje inicijalizirane su, ali se mogu pokrenuti samo kada se JVM isključi.
- Shutdown hookovi su pouzdaniji od finalizer() jer postoje vrlo manje šanse da se shutdown hookovi ne pokrenu.
- Priključak za isključivanje može se zaustaviti pozivanjem metode halt(int) klase Runtime.
20) Kada trebamo prekinuti nit?
Trebali bismo prekinuti nit kada želimo prekinuti stanje mirovanja ili čekanja niti. Nit možemo prekinuti pozivanjem interrupt()�izbacivanjem InterruptedException.
set vs kartaViše detalja.
21) Što je sinkronizacija?
Sinkronizacija je sposobnost kontrole pristupa više niti bilo kojem zajedničkom resursu. Koristi se:
- Da biste spriječili smetnje niti.
- Kako biste spriječili problem dosljednosti.
Kada više niti pokuša izvršiti isti zadatak, postoji mogućnost pogrešnog rezultata, stoga da bi uklonila ovaj problem, Java koristi proces sinkronizacije koji dopušta izvršavanje samo jedne niti u isto vrijeme. Sinkronizacija se može postići na tri načina:
- sinkroniziranom metodom
- sinkroniziranim blokom
- statičkom sinkronizacijom
Sintaksa za sinkronizirani blok
synchronized(object reference expression) { //code block }Više detalja.
22) Koja je svrha sinkroniziranog bloka?
Sinkronizirani blok može se koristiti za izvođenje sinkronizacije na bilo kojem specifičnom resursu metode. Samo jedna nit u isto vrijeme može se izvršiti na određenom resursu, a sve ostale dretve koje pokušaju ući u sinkronizirani blok su blokirane.
- Sinkronizirani blok koristi se za zaključavanje objekta za bilo koji zajednički resurs.
- Opseg sinkroniziranog bloka ograničen je na blok na koji se primjenjuje. Njegov opseg je manji od metode.
23) Može li se Java objekt zaključati za isključivu upotrebu od strane određene niti?
Da. Objekt možete zaključati stavljanjem u 'sinkronizirani' blok. Zaključani objekt nedostupan je bilo kojoj niti osim onoj koja ga je eksplicitno preuzela.
24) Što je statička sinkronizacija?
Ako bilo koju statičku metodu učinite sinkroniziranom, zaključavanje će biti na klasi, a ne na objektu. Ako koristimo sinkroniziranu ključnu riječ prije metode, ona će zaključati objekt (jedna nit može pristupiti objektu u isto vrijeme), ali ako koristimo static synchronized, zaključat će klasu (jedna po jedna nit može pristupiti klasi). Više detalja.
25) Koja je razlika između notify() i notifyAll()?
Notify() se koristi za deblokiranje jedne niti na čekanju, dok se metoda notifyAll() koristi za deblokiranje svih niti u stanju čekanja.
26) Što je zastoj?
Zastoj je situacija u kojoj svaka nit čeka na resurs koji drži neka druga nit na čekanju. U ovoj situaciji, niti jedna nit se ne izvršava niti ima priliku da se izvrši. Umjesto toga, među svim nitima postoji univerzalno stanje čekanja. Zastoj je vrlo komplicirana situacija koja može pokvariti naš kod tijekom izvođenja.
Više detalja.27) Kako otkriti stanje zastoja? Kako se može izbjeći?
Uvjet zastoja možemo otkriti pokretanjem koda na cmd-u i prikupljanjem ispisa niti, a ako je bilo kakav zastoj prisutan u kodu, poruka će se pojaviti na cmd-u.
Načini izbjegavanja stanja zastoja u Javi:
28) Što je Thread Scheduler u Javi?
U Javi, kada stvaramo niti, one se nadziru uz pomoć Thread Scheduler-a, koji je dio JVM-a. Planer niti odgovoran je samo za odlučivanje koja nit treba biti izvršena. Planer niti koristi dva mehanizma za raspoređivanje niti: Preemptive i Time Slicing.
Java planer niti također radi za odlučivanje o sljedećem za nit:- Odabire prioritet niti.
- Određuje vrijeme čekanja za nit
- Provjerava prirodu niti
29) Ima li svaka nit svoj stog u višenitnom programiranju?
Da, u višenitnom programiranju svaka nit održava svoje vlastito ili zasebno područje stogova u memoriji zbog čega je svaka nit neovisna jedna o drugoj.
30) Kako se postiže sigurnost niti?
Ako metodu ili objekt klase može koristiti više niti istovremeno bez ikakvih uvjeta utrke, tada je klasa sigurna za niti. Sigurnost niti se koristi kako bi program bio siguran za korištenje u višenitnom programiranju. To se može postići na sljedeće načine:
- Sinkronizacija
- Korištenje ključne riječi Volatile
- Korištenje mehanizma koji se temelji na bravi
- Korištenje atomskih klasa omotača
31) Što je stanje utrke?
Stanje utrke je problem koji se javlja u višenitnom programiranju kada se različite niti izvršavaju istovremeno pristupajući zajedničkom resursu u isto vrijeme. Ispravno korištenje sinkronizacije može izbjeći stanje utrke.
32) Koja je ključna riječ volatile u Javi?
Ključna riječ volatile koristi se u višenitnom programiranju kako bi se postigla sigurnost niti, budući da je promjena u jednoj volatile varijabli vidljiva svim ostalim nitima, tako da jedna varijabla može koristiti jedna po jedna nit.
33) Što podrazumijevate pod skupom niti?
- Java Thread pool predstavlja grupu radnih niti koje čekaju na dodjelu zadatka.
- Niti u skupu niti nadzire pružatelj usluga koji povlači jednu nit iz skupa i dodjeljuje joj posao.
- Nakon završetka zadanog zadatka, thread je ponovno došao u skup niti.
- Veličina skupa niti ovisi o ukupnom broju niti koje se drže u rezervi za izvođenje.
Prednosti skupa niti su:
- Korištenjem skupa niti, performanse se mogu poboljšati.
- Korištenjem skupa niti može doći do bolje stabilnosti sustava.
Pitanja za paralelni intervju
34) Koje su glavne komponente API-ja za istodobnost?
Concurrency API može se razviti pomoću klase i sučelja paketa java.util.Concurrent. Postoje sljedeće klase i sučelja u paketu java.util.Concurrent.
- Izvršitelj
- FarkJoinPool
- IzvršiteljService
- ScheduledExecutorService
- Budućnost
- TimeUnit(Enum)
- CountDownLatch
- Ciklička barijera
- Semafor
- ThreadFactory
- BlockingQueue
- DelayQueue
- Brave
- Phaser
35) Što je Executor sučelje u Concurrency API-ju u Javi?
Sučelje izvršitelja koje pruža paket java.util.concurrent je jednostavno sučelje koje se koristi za izvršavanje novog zadatka. Metoda execute() sučelja Executor koristi se za izvršavanje neke zadane naredbe. Sintaksa metode execute() data je u nastavku.
void izvršiti (naredba koja se može pokrenuti)
Razmotrite sljedeći primjer:
naplata s git-om
import java.util.concurrent.Executor; import java.util.concurrent.Executors; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class TestThread { public static void main(final String[] arguments) throws InterruptedException { Executor e = Executors.newCachedThreadPool(); e.execute(new Thread()); ThreadPoolExecutor pool = (ThreadPoolExecutor)e; pool.shutdown(); } static class Thread implements Runnable { public void run() { try { Long duration = (long) (Math.random() * 5); System.out.println('Running Thread!'); TimeUnit.SECONDS.sleep(duration); System.out.println('Thread Completed'); } catch (InterruptedException ex) { ex.printStackTrace(); } } } }
Izlaz
Running Thread! Thread Completed
36) Što je BlockingQueue?
Java.util.concurrent.BlockingQueue je podsučelje Queuea koje podržava operacije kao što je čekanje dostupnosti prostora prije umetanja nove vrijednosti ili čekanje da red postane neprazan prije dohvaćanja elementa iz njega. Razmotrite sljedeći primjer.
import java.util.Random; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; public class TestThread { public static void main(final String[] arguments) throws InterruptedException { BlockingQueue queue = new ArrayBlockingQueue(10); Insert i = new Insert(queue); Retrieve r = new Retrieve(queue); new Thread(i).start(); new Thread(r).start(); Thread.sleep(2000); } static class Insert implements Runnable { private BlockingQueue queue; public Insert(BlockingQueue queue) { this.queue = queue; } @Override public void run() { Random random = new Random(); try { int result = random.nextInt(200); Thread.sleep(1000); queue.put(result); System.out.println('Added: ' + result); result = random.nextInt(10); Thread.sleep(1000); queue.put(result); System.out.println('Added: ' + result); result = random.nextInt(50); Thread.sleep(1000); queue.put(result); System.out.println('Added: ' + result); } catch (InterruptedException e) { e.printStackTrace(); } } } static class Retrieve implements Runnable { private BlockingQueue queue; public Retrieve(BlockingQueue queue) { this.queue = queue; } @Override public void run() { try { System.out.println('Removed: ' + queue.take()); System.out.println('Removed: ' + queue.take()); System.out.println('Removed: ' + queue.take()); } catch (InterruptedException e) { e.printStackTrace(); } } } }
Izlaz
Added: 96 Removed: 96 Added: 8 Removed: 8 Added: 5 Removed: 5
37) Kako implementirati problem proizvođač-potrošač korištenjem BlockingQueue?
Problem proizvođač-potrošač može se riješiti korištenjem BlockingQueue na sljedeći način.
import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import java.util.logging.Level; import java.util.logging.Logger; public class ProducerConsumerProblem { public static void main(String args[]){ //Creating shared object BlockingQueue sharedQueue = new LinkedBlockingQueue(); //Creating Producer and Consumer Thread Thread prod = new Thread(new Producer(sharedQueue)); Thread cons = new Thread(new Consumer(sharedQueue)); //Starting producer and Consumer thread prod.start(); cons.start(); } } //Producer Class in java class Producer implements Runnable { private final BlockingQueue sharedQueue; public Producer(BlockingQueue sharedQueue) { this.sharedQueue = sharedQueue; } @Override public void run() { for(int i=0; i<10; i++){ try { system.out.println('produced: ' + i); sharedqueue.put(i); } catch (interruptedexception ex) logger.getlogger(producer.class.getname()).log(level.severe, null, ex); consumer class in java implements runnable{ private final blockingqueue sharedqueue; public (blockingqueue sharedqueue) this.sharedqueue="sharedQueue;" @override void run() while(true){ system.out.println('consumed: '+ sharedqueue.take()); logger.getlogger(consumer.class.getname()).log(level.severe, < pre> <p> <strong>Output</strong> </p> <pre> Produced: 0 Produced: 1 Produced: 2 Produced: 3 Produced: 4 Produced: 5 Produced: 6 Produced: 7 Produced: 8 Produced: 9 Consumed: 0 Consumed: 1 Consumed: 2 Consumed: 3 Consumed: 4 Consumed: 5 Consumed: 6 Consumed: 7 Consumed: 8 Consumed: 9 </pre> <hr> <h3>38) What is the difference between Java Callable interface and Runnable interface?</h3> <p>The Callable interface and Runnable interface both are used by the classes which wanted to execute with multiple threads. However, there are two main differences between the both : </p> <ul> <li>A Callable interface can return a result, whereas the Runnable interface cannot return any result.</li> <li>A Callable interface can throw a checked exception, whereas the Runnable interface cannot throw checked exception. </li> <li>A Callable interface cannot be used before the Java 5 whereas the Runnable interface can be used.</li> </ul> <hr> <h3>39) What is the Atomic action in Concurrency in Java?</h3> <ul> <li>The Atomic action is the operation which can be performed in a single unit of a task without any interference of the other operations.</li> <li>The Atomic action cannot be stopped in between the task. Once started it fill stop after the completion of the task only. </li> <li>An increment operation such as a++ does not allow an atomic action.</li> <li>All reads and writes operation for the primitive variable (except long and double) are the atomic operation.</li> <li>All reads and writes operation for the volatile variable (including long and double) are the atomic operation.</li> <li>The Atomic methods are available in java.util.Concurrent package. </li> </ul> <hr> <h3>40) What is lock interface in Concurrency API in Java?</h3> <p>The java.util.concurrent.locks.Lock interface is used as the synchronization mechanism. It works similar to the synchronized block. There are a few differences between the lock and synchronized block that are given below.</p> <ul> <li>Lock interface provides the guarantee of sequence in which the waiting thread will be given the access, whereas the synchronized block doesn't guarantee it.</li> <li>Lock interface provides the option of timeout if the lock is not granted whereas the synchronized block doesn't provide that.</li> <li>The methods of Lock interface, i.e., Lock() and Unlock() can be called in different methods whereas single synchronized block must be fully contained in a single method.</li> </ul> <hr> <h3>41) Explain the ExecutorService Interface.</h3> <p>The ExecutorService Interface is the subinterface of Executor interface and adds the features to manage the lifecycle. Consider the following example.</p> <pre> import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class TestThread { public static void main(final String[] arguments) throws InterruptedException { ExecutorService e = Executors.newSingleThreadExecutor(); try { e.submit(new Thread()); System.out.println('Shutdown executor'); e.shutdown(); e.awaitTermination(5, TimeUnit.SECONDS); } catch (InterruptedException ex) { System.err.println('tasks interrupted'); } finally { if (!e.isTerminated()) { System.err.println('cancel non-finished tasks'); } e.shutdownNow(); System.out.println('shutdown finished'); } } static class Task implements Runnable { public void run() { try { Long duration = (long) (Math.random() * 20); System.out.println('Running Task!'); TimeUnit.SECONDS.sleep(duration); } catch (InterruptedException ex) { ex.printStackTrace(); } } } } </pre> <p> <strong>Output</strong> </p> <pre> Shutdown executor shutdown finished </pre> <hr> <h3>42) What is the difference between Synchronous programming and Asynchronous programming regarding a thread?</h3> <p> <strong>Synchronous programming: </strong> In Synchronous programming model, a thread is assigned to complete a task and hence thread started working on it, and it is only available for other tasks once it will end the assigned task.</p> <p> <strong>Asynchronous Programming: </strong> In Asynchronous programming, one job can be completed by multiple threads and hence it provides maximum usability of the various threads.</p> <hr> <h3>43) What do you understand by Callable and Future in Java?</h3> <p> <strong>Java Callable interface: </strong> In Java5 callable interface was provided by the package java.util.concurrent. It is similar to the Runnable interface but it can return a result, and it can throw an Exception. It also provides a run() method for execution of a thread. Java Callable can return any object as it uses Generic.</p> <p> <strong>Syntax:</strong> </p> <p>public interface Callable</p> <p> <strong>Java Future interface:</strong> Java Future interface gives the result of a concurrent process. The Callable interface returns the object of java.util.concurrent.Future.</p> <p>Java Future provides following methods for implementation.</p> <ul> <tr><td>cancel(boolean�mayInterruptIfRunning):</td> It is used to cancel the execution of the assigned task. </tr><tr><td>get():</td> It waits for the time if execution not completed and then retrieved the result. </tr><tr><td>isCancelled():</td> It returns the Boolean value as it returns true if the task was canceled before the completion. </tr><tr><td>isDone():</td> It returns true if the job is completed successfully else returns false. </tr></ul> <hr> <h3>44. What is the difference between ScheduledExecutorService and ExecutorService interface?</h3> <p>ExecutorServcie and ScheduledExecutorService both are the interfaces of java.util.Concurrent package but scheduledExecutorService provides some additional methods to execute the Runnable and Callable tasks with the delay or every fixed time period.</p> <h3>45) Define FutureTask class in Java? </h3> <p>Java FutureTask class provides a base implementation of the Future interface. The result can only be obtained if the execution of one task is completed, and if the computation is not achieved then get method will be blocked. If the execution is completed, then it cannot be re-started and can't be canceled.</p> <p> <strong>Syntax</strong> </p> <p>public class FutureTask extends Object implements RunnableFuture</p> <hr></10;>
38) Koja je razlika između Java Callable sučelja i Runnable sučelja?
Callable sučelje i Runnable sučelje koriste klase koje žele izvršiti s više niti. Međutim, postoje dvije glavne razlike između oba:
- Callable sučelje može vratiti rezultat, dok Runnable sučelje ne može vratiti nikakav rezultat.
- Callable sučelje može izbaciti provjerenu iznimku, dok Runnable sučelje ne može izbaciti provjerenu iznimku.
- Callable sučelje ne može se koristiti prije Jave 5, dok se Runnable sučelje može koristiti.
39) Što je Atomic radnja u Concurrency u Javi?
- Atomska radnja je operacija koja se može izvesti u jednoj jedinici zadatka bez ikakvog uplitanja drugih operacija.
- Akcija Atomic ne može se zaustaviti između zadatka. Jednom kada se pokrene, ispunjava se samo nakon završetka zadatka.
- Operacija povećanja kao što je a++ ne dopušta atomsku akciju.
- Sve operacije čitanja i pisanja za primitivnu varijablu (osim long i double) su atomske operacije.
- Sve operacije čitanja i pisanja za volatile varijablu (uključujući long i double) su atomske operacije.
- Atomske metode dostupne su u paketu java.util.Concurrent.
40) Što je zaključano sučelje u Concurrency API-ju u Javi?
Sučelje java.util.concurrent.locks.Lock koristi se kao mehanizam sinkronizacije. Djeluje slično sinkroniziranom bloku. Postoji nekoliko razlika između brave i sinkroniziranog bloka koje su navedene u nastavku.
- Lock sučelje jamči redoslijed u kojem će nit koja čeka dobiti pristup, dok sinkronizirani blok to ne jamči.
- Sučelje za zaključavanje nudi opciju vremenskog ograničenja ako zaključavanje nije odobreno, dok sinkronizirani blok to ne pruža.
- Metode sučelja Lock, tj. Lock() i Unlock() mogu se pozvati u različitim metodama, dok jedan sinkronizirani blok mora biti u potpunosti sadržan u jednoj metodi.
41) Objasnite sučelje ExecutorService.
Sučelje ExecutorService podsučelje je sučelja Executor i dodaje značajke za upravljanje životnim ciklusom. Razmotrite sljedeći primjer.
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class TestThread { public static void main(final String[] arguments) throws InterruptedException { ExecutorService e = Executors.newSingleThreadExecutor(); try { e.submit(new Thread()); System.out.println('Shutdown executor'); e.shutdown(); e.awaitTermination(5, TimeUnit.SECONDS); } catch (InterruptedException ex) { System.err.println('tasks interrupted'); } finally { if (!e.isTerminated()) { System.err.println('cancel non-finished tasks'); } e.shutdownNow(); System.out.println('shutdown finished'); } } static class Task implements Runnable { public void run() { try { Long duration = (long) (Math.random() * 20); System.out.println('Running Task!'); TimeUnit.SECONDS.sleep(duration); } catch (InterruptedException ex) { ex.printStackTrace(); } } } }
Izlaz
Shutdown executor shutdown finished
42) Koja je razlika između sinkronog programiranja i asinkronog programiranja u vezi s niti?
Sinkrono programiranje: U modelu sinkronog programiranja, nit je dodijeljena za dovršenje zadatka i stoga je nit počela raditi na njemu, a dostupna je za druge zadatke samo nakon što završi dodijeljeni zadatak.
Asinkrono programiranje: U asinkronom programiranju jedan posao može dovršiti više niti i stoga pruža maksimalnu iskoristivost različitih niti.
43) Što podrazumijevate pod Callable i Future u Javi?
Java Callable sučelje: U Javi5 sučelje koje se može pozivati bilo je omogućeno paketom java.util.concurrent. Slično je Runnable sučelju, ali može vratiti rezultat i može baciti iznimku. Također nudi metodu run() za izvođenje niti. Java Callable može vratiti bilo koji objekt jer koristi Generic.
Sintaksa:
što je prolog
javno sučelje Pozivno
Java Future sučelje: Java Future sučelje daje rezultat istovremenog procesa. Callable sučelje vraća objekt java.util.concurrent.Future.
Java Future nudi sljedeće metode za implementaciju.
44. Koja je razlika između sučelja ScheduledExecutorService i ExecutorService?
ExecutorServcie i ScheduledExecutorService su sučelja paketa java.util.Concurrent, ali scheduledExecutorService pruža neke dodatne metode za izvršavanje Runnable i Callable zadataka s odgodom ili u svakom fiksnom vremenskom razdoblju.
45) Definirati klasu FutureTask u Javi?
Klasa Java FutureTask pruža osnovnu implementaciju sučelja Future. Rezultat se može dobiti samo ako je izvršenje jednog zadatka dovršeno, a ako se izračun ne postigne tada će get metoda biti blokirana. Ako je izvršenje dovršeno, ne može se ponovno pokrenuti i ne može se poništiti.
Sintaksa
javna klasa FutureTask extends Object implementira RunnableFuture
10;>