Multithreading a synchronizácia sa považujú za typickú kapitolu programovania v jazyku Java. V spoločnostiach zaoberajúcich sa vývojom hier sa väčšinou kladú otázky týkajúce sa multithreadingových rozhovorov. Nižšie je uvedený zoznam často kladených otázok o java multithreading a súbežnom rozhovore.
Otázky na viacvláknový pohovor
1) Čo je to multithreading?
Multithreading je proces vykonávania viacerých vlákien súčasne. Multithreading sa používa na získanie multitaskingu. Spotrebováva menej pamäte a poskytuje rýchly a efektívny výkon. Jeho hlavné výhody sú:
- Vlákna zdieľajú rovnaký adresný priestor.
- Niť je ľahká.
- Náklady na komunikáciu medzi procesmi sú nízke.
2) Aké je vlákno?
Vlákno je ľahký podproces. Je to samostatná cesta vykonávania, pretože každé vlákno beží v inom rámci zásobníka. Proces môže obsahovať viacero vlákien. Vlákna zdieľajú prostriedky procesu, ale stále sa vykonávajú nezávisle.
Viac informácií.3) Rozdiel medzi procesom a vláknom?
Medzi procesom a vláknom sú nasledujúce rozdiely.
- Program vo vykonávaní sa nazýva proces, zatiaľ čo; Vlákno je podmnožinou procesu
- Procesy sú nezávislé, zatiaľ čo vlákna sú podmnožinou procesov.
- Proces má rôzny adresný priestor v pamäti, zatiaľ čo vlákna obsahujú zdieľaný adresný priestor.
- Prepínanie kontextu je rýchlejšie medzi vláknami v porovnaní s procesmi.
- Komunikácia medzi procesmi je pomalšia a drahšia ako komunikácia medzi vláknami.
- Akákoľvek zmena v nadradenom procese neovplyvní podriadený proces, zatiaľ čo zmeny v nadradenom vlákne môžu ovplyvniť podriadené vlákno.
4) Čo rozumiete pod komunikáciou medzi vláknami?
- Proces komunikácie medzi synchronizovanými vláknami sa nazýva medzivláknová komunikácia.
- Komunikácia medzi vláknami sa používa na zamedzenie dopytovania vlákien v jazyku Java.
- Vlákno je pozastavené vo svojej kritickej sekcii a ďalšie vlákno môže vstúpiť (alebo uzamknúť) do rovnakej kritickej sekcie, ktorá sa má spustiť.
- Dá sa získať metódami wait(), notify() a notifyAll().
5) Aký je účel metódy wait() v Jave?
Metódu wait() poskytuje trieda Object v jazyku Java. Táto metóda sa používa na komunikáciu medzi vláknami v jazyku Java. java.lang.Object.wait() sa používa na pozastavenie aktuálneho vlákna a počkanie, kým iné vlákno nezavolá metódu notify() alebo notifyAll(). Jeho syntax je uvedená nižšie.
public final void wait()
6) Prečo musí byť metóda wait() volaná zo synchronizovaného bloku?
Musíme zavolať metódu čakania, inak to vyhodí java.lang.IllegalMonitorStateException výnimkou. Okrem toho potrebujeme metódu wait() na komunikáciu medzi vláknami s notify() a notifyAll(). Preto musí byť prítomný v synchronizovanom bloku pre správnu a správnu komunikáciu.
7) Aké sú výhody multithreadingu?
Viacvláknové programovanie má nasledujúce výhody:
- Multithreading umožňuje aplikácii/programu, aby bol vždy reaktívny na vstup, aj keď už beží s niektorými úlohami na pozadí
- Viacvláknové spracovanie umožňuje rýchlejšie vykonávanie úloh, pretože vlákna sa vykonávajú nezávisle.
- Viacvláknové spracovanie poskytuje lepšie využitie vyrovnávacej pamäte, keďže vlákna zdieľajú spoločné pamäťové zdroje.
- Multithreading znižuje počet požadovaných serverov, pretože jeden server môže vykonávať viacero vlákien naraz.
8) Aké sú stavy životného cyklu vlákna?
Vlákno môže mať počas svojej životnosti jeden z nasledujúcich stavov:
9) Aký je rozdiel medzi preventívnym plánovaním a krájaním času?
Pri preemptívnom plánovaní sa úloha s najvyššou prioritou vykonáva, kým neprejde do čakacieho alebo mŕtveho stavu alebo kým nevznikne úloha s vyššou prioritou. Pri časovom delení sa úloha vykonáva počas vopred definovaného časového úseku a potom znova vstúpi do skupiny pripravených úloh. Plánovač potom na základe priority a iných faktorov určí, ktorá úloha sa má vykonať ako ďalšia.
10) Čo je prepínanie kontextu?
Pri prepínaní kontextu je stav procesu (alebo vlákna) uložený tak, aby ho bolo možné obnoviť a spustiť z toho istého bodu neskôr. Prepínanie kontextu umožňuje viacerým procesom zdieľať rovnaký CPU.
11) Rozdiel medzi triedou Thread a rozhraním Runnable pri vytváraní vlákna?
Vlákno je možné vytvoriť dvoma spôsobmi.
- Rozšírením triedy Thread
- Implementáciou rozhrania Runnable
Hlavné rozdiely medzi oboma spôsobmi sú však uvedené nižšie:
- Rozšírením triedy Thread nemôžeme rozšíriť žiadnu inú triedu, pretože Java neumožňuje viacnásobné dedenie pri implementácii rozhrania Runnable; môžeme tiež rozšíriť inú základnú triedu (ak je to potrebné).
- Rozšírením triedy Thread každé vlákno vytvorí jedinečný objekt a priradí sa k nemu pri implementácii rozhrania Runnable; viaceré vlákna zdieľajú ten istý objekt
- Trieda Thread poskytuje rôzne vstavané metódy, ako napríklad getPriority(), isAlive a mnohé ďalšie, zatiaľ čo rozhranie Runnable poskytuje jedinú metódu, t. j. run().
12) Čo znamená metóda join()?
Metóda join() čaká, kým vlákno zanikne. Inými slovami, spôsobí, že aktuálne spustené vlákna sa prestanú vykonávať, kým vlákno, ku ktorému sa pripája, nedokončí svoju úlohu. Metóda spojenia je preťažená v triede Thread nasledujúcimi spôsobmi.
- public void join()hodí InterruptedException
- public void join (dlhé milisekundy) vyvolá InterruptedException
13) Popíšte účel a fungovanie metódy sleep().
Metóda sleep() v jazyku Java sa používa na zablokovanie vlákna na určitý čas, čo znamená, že pozastaví vykonávanie vlákna na určitý čas. Sú na to dva spôsoby.
Syntax:
pole reťazcov v jazyku c
- verejný statický void spánok (dlhé milisekúndy) vyvolá prerušenú výnimku
- verejný statický void spánok (dlhé milisekúndy, int nanos) vyvolá InterruptedException
Fungovanie metódy sleep().
Keď zavoláme metódu sleep(), pozastaví vykonávanie aktuálneho vlákna na daný čas a uprednostní iné vlákno (ak je k dispozícii). Navyše, keď je čakacia doba dokončená, predchádzajúce vlákno opäť zmení svoj stav z čakania na spustiteľné a dostane sa do stavu spustenia a celý proces tak pokračuje, až kým sa vykonanie nedokončí.
14) Aký je rozdiel medzi metódou wait() a sleep()?
počkaj () | spánok () |
---|---|
1) Metóda wait() je definovaná v triede Object. | Metóda sleep() je definovaná v triede Thread. |
2) Metóda wait() uvoľní zámok. | Metóda sleep() neuvoľní zámok. |
15) Je možné začať vlákno dvakrát?
Nie, vlákno nemôžeme reštartovať, pretože po spustení a spustení vlákna prejde do stavu mŕtveho. Preto, ak sa pokúsime spustiť vlákno dvakrát, poskytne runtimeException 'java.lang.IllegalThreadStateException'. Zvážte nasledujúci príklad.
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(); } }
Výkon
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)Viac informácií.
16) Môžeme zavolať metódu run() namiesto start()?
Áno, priame volanie metódy run() je platné, ale nebude fungovať ako vlákno, namiesto toho bude fungovať ako normálny objekt. Medzi vláknami nebude dochádzať k prepínaniu kontextu. Keď zavoláme metódu start(), interne zavolá metódu run(), ktorá vytvorí nový zásobník pre vlákno, zatiaľ čo priame volanie run() nevytvorí nový zásobník.
palindróm v JaveViac informácií.
17) A čo vlákna démonov?
Vlákna démonov sú vlákna s nízkou prioritou, ktoré poskytujú užívateľským vláknam podporu a služby na pozadí. Vlákno démona automaticky ukončí JVM, ak program zostane iba vo vlákne démona a všetky ostatné používateľské vlákna sú ukončené/zomreli. V triede Thread sú k dispozícii dve metódy pre vlákno démona:
18) Môžeme používateľské vlákno vytvoriť ako vlákno démona, ak je vlákno spustené?
Nie, ak tak urobíte, vyvolá to IllegalThreadStateException. Preto môžeme pred spustením vlákna vytvoriť iba vlákno démona.
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. } }
Výkon
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)Viac informácií.
19) Čo je to vypínací hák?
Vypínací hák je vlákno, ktoré je vyvolané implicitne pred vypnutím JVM. Môžeme ho teda použiť na vyčistenie zdroja alebo uloženie stavu, keď sa JVM normálne alebo náhle vypne. Vypínací hák môžeme pridať pomocou nasledujúcej metódy:
public�void�addShutdownHook(Thread�hook){}�� Runtime r=Runtime.getRuntime(); r.addShutdownHook(new MyThread());
Niektoré dôležité body týkajúce sa vypínacích hákov sú:
- Vypínacie háky sú inicializované, ale dajú sa spustiť len vtedy, keď dôjde k vypnutiu JVM.
- Vypínacie háky sú spoľahlivejšie ako finalizér(), pretože existuje veľmi menšia šanca, že sa vypínacie háky nespustia.
- Vypínací hák možno zastaviť volaním metódy halt(int) triedy Runtime.
20) Kedy by sme mali prerušiť vlákno?
Vlákno by sme mali prerušiť, keď chceme prerušiť režim spánku alebo čakania vlákna. Vlákno môžeme prerušiť zavolaním interrupt()�vyhodením InterruptedException.
Viac informácií.21) Čo je to synchronizácia?
Synchronizácia je schopnosť riadiť prístup viacerých vlákien k akémukoľvek zdieľanému zdroju. Je to použité:
- Aby sa zabránilo rušeniu závitu.
- Aby sa predišlo problémom s konzistenciou.
Keď sa viaceré vlákna pokúšajú vykonať rovnakú úlohu, existuje možnosť chybného výsledku, preto na odstránenie tohto problému Java používa proces synchronizácie, ktorý umožňuje spustenie iba jedného vlákna naraz. Synchronizáciu je možné dosiahnuť tromi spôsobmi:
- synchronizovanou metódou
- synchronizovaným blokom
- statickou synchronizáciou
Syntax pre synchronizovaný blok
synchronized(object reference expression) { //code block }Viac informácií.
22) Aký je účel synchronizovaného bloku?
Synchronizovaný blok možno použiť na vykonanie synchronizácie na akomkoľvek špecifickom zdroji metódy. Na konkrétnom zdroji môže byť súčasne vykonávané iba jedno vlákno a všetky ostatné vlákna, ktoré sa pokúšajú vstúpiť do synchronizovaného bloku, sú zablokované.
- Synchronizovaný blok sa používa na uzamknutie objektu pre akýkoľvek zdieľaný zdroj.
- Rozsah synchronizovaného bloku je obmedzený na blok, na ktorý sa aplikuje. Jeho rozsah je menší ako metóda.
23) Môže byť objekt Java uzamknutý pre výhradné použitie pre dané vlákno?
Áno. Objekt môžete uzamknúť umiestnením do „synchronizovaného“ bloku. Zamknutý objekt je neprístupný žiadnemu vláknu okrem toho, ktoré si ho výslovne nárokovalo.
24) Čo je statická synchronizácia?
Ak urobíte akúkoľvek statickú metódu ako synchronizovanú, zámok bude na triede, nie na objekte. Ak použijeme kľúčové slovo synchronized pred metódou, tak to uzamkne objekt (jedno vlákno môže pristupovať k objektu naraz), ale ak použijeme statické synchronizované, tak to zamkne triedu (jedno vlákno môže pristupovať k triede naraz). Viac informácií.
25) Aký je rozdiel medzi notify() a notifyAll()?
Notify() sa používa na odblokovanie jedného čakajúceho vlákna, zatiaľ čo metóda notifyAll() sa používa na odblokovanie všetkých vlákien v stave čakania.
26) Čo je patová situácia?
Uviaznutie je situácia, v ktorej každé vlákno čaká na zdroj, ktorý drží nejaké iné čakajúce vlákno. V tejto situácii sa ani jedno vlákno nespustí, ani nedostane šancu na vykonanie. Namiesto toho existuje medzi všetkými vláknami univerzálny stav čakania. Deadlock je veľmi komplikovaná situácia, ktorá môže prelomiť náš kód za behu.
Viac informácií.27) Ako zistiť stav zablokovania? Ako sa tomu dá vyhnúť?
Stav zablokovania môžeme zistiť spustením kódu na cmd a zhromaždením výpisu vlákien, a ak sa v kóde vyskytne zablokovanie, na cmd sa zobrazí správa.
Spôsoby, ako sa vyhnúť zablokovaniu v jazyku Java:
28) Čo je to Thread Scheduler v jazyku Java?
V Jave, keď vytvárame vlákna, sú kontrolované pomocou Thread Scheduler, ktorý je súčasťou JVM. Plánovač vlákien je zodpovedný len za rozhodnutie, ktoré vlákno sa má spustiť. Plánovač vlákien používa dva mechanizmy na plánovanie vlákien: Preemptive a Time Slicing.
Plánovač vlákien Java funguje aj pri rozhodovaní o nasledujúcom vlákne:- Vyberá prioritu vlákna.
- Určuje čakaciu dobu na vlákno
- Kontroluje povahu vlákna
29) Má každé vlákno svoj zásobník vo viacvláknovom programovaní?
Áno, vo viacvláknovom programovaní si každé vlákno udržiava svoju vlastnú alebo oddelenú oblasť zásobníka v pamäti, vďaka čomu je každé vlákno na sebe nezávislé.
30) Ako sa dosiahne bezpečnosť vlákna?
Ak metódu alebo objekt triedy môže použiť viacero vlákien naraz bez akejkoľvek podmienky súbehu, potom je trieda bezpečná pre vlákna. Bezpečnosť vlákien sa používa na zabezpečenie bezpečného používania programu vo viacvláknovom programovaní. Dá sa to dosiahnuť nasledujúcimi spôsobmi:
- Synchronizácia
- Použitie nestáleho kľúčového slova
- Použitie mechanizmu na báze zámku
- Použitie tried atómového obalu
31) Čo je to rasová podmienka?
Race condition je problém, ktorý sa vyskytuje vo viacvláknovom programovaní, keď rôzne vlákna vykonávajú simultánny prístup k zdieľanému zdroju v rovnakom čase. Správnym používaním synchronizácie sa môžete vyhnúť Race stavu.
32) Čo je prchavé kľúčové slovo v jazyku Java?
Nestále kľúčové slovo sa používa vo viacvláknovom programovaní na dosiahnutie bezpečnosti vlákna, pretože zmena v jednej volatilnej premennej je viditeľná pre všetky ostatné vlákna, takže jednu premennú môže naraz použiť jedno vlákno.
33) Čo rozumiete pod pojmom fond vlákien?
- Java Thread pool predstavuje skupinu pracovných vlákien, ktoré čakajú na pridelenie úlohy.
- Na vlákna v oblasti vlákien dohliada poskytovateľ služby, ktorý stiahne jedno vlákno z oblasti a priradí mu úlohu.
- Po dokončení danej úlohy sa vlákno opäť dostalo do fondu vlákien.
- Veľkosť oblasti vlákien závisí od celkového počtu vlákien uchovávaných ako rezerva na vykonanie.
Výhody fondu vlákien sú:
- Pomocou fondu vlákien je možné zvýšiť výkon.
- Použitím oblasti vlákien môže dôjsť k lepšej stabilite systému.
Otázky týkajúce sa súbežného pohovoru
34) Aké sú hlavné komponenty súbežného API?
Concurrency API je možné vyvinúť pomocou triedy a rozhraní balíka java.util.Concurrent. V balíku java.util.Concurrent sú nasledujúce triedy a rozhrania.
- Exekútor
- FarkJoinPool
- ExecutorService
- ScheduledExecutorService
- Budúcnosť
- Časová jednotka (výčet)
- CountDownLatch
- CyclicBarrier
- Semafor
- ThreadFactory
- BlockingQueue
- DelayQueue
- Zámky
- Phaser
35) Čo je rozhranie Executor v Concurrency API v Jave?
Rozhranie Executor poskytované balíkom java.util.concurrent je jednoduché rozhranie používané na vykonanie novej úlohy. Metóda execute() rozhrania Executor sa používa na vykonanie určitého príkazu. Syntax metódy execute() je uvedená nižšie.
void spustiť (spustiteľný príkaz)
ankita dave
Zvážte nasledujúci príklad:
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(); } } } }
Výkon
Running Thread! Thread Completed
36) Čo je BlockingQueue?
java.util.concurrent.BlockingQueue je podrozhranie frontu, ktoré podporuje operácie, ako je čakanie na dostupnosť miesta pred vložením novej hodnoty alebo čakanie, kým sa front nevyprázdni, skôr ako z neho získa prvok. Zvážte nasledujúci príklad.
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(); } } } }
Výkon
Added: 96 Removed: 96 Added: 8 Removed: 8 Added: 5 Removed: 5
37) Ako implementovať problém producent-spotrebiteľ pomocou BlockingQueue?
Problém výrobcu a spotrebiteľa je možné vyriešiť pomocou BlockingQueue nasledujúcim spôsobom.
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) Aký je rozdiel medzi rozhraním Java Callable a rozhraním Runnable?
Rozhranie Callable a rozhranie Runnable používajú triedy, ktoré sa chceli spustiť s viacerými vláknami. Medzi oboma sú však dva hlavné rozdiely:
- Volateľné rozhranie môže vrátiť výsledok, zatiaľ čo rozhranie Runnable nemôže vrátiť žiadny výsledok.
- Volateľné rozhranie môže vyvolať kontrolovanú výnimku, zatiaľ čo rozhranie Runnable nemôže vyvolať začiarknutú výnimku.
- Rozhranie Callable nemožno použiť pred Java 5, zatiaľ čo rozhranie Runnable možno použiť.
39) Čo je Atómová akcia v Concurrency v Jave?
- Atómová akcia je operácia, ktorú možno vykonať v jednej jednotke úlohy bez akéhokoľvek zasahovania do iných operácií.
- Atómová akcia nemôže byť zastavená medzi úlohou. Po spustení sa vyplní až po dokončení úlohy.
- Operácia prírastku, ako je a++, neumožňuje atómovú akciu.
- Všetky operácie čítania a zápisu pre primitívnu premennú (okrem long a double) sú atomické operácie.
- Všetky operácie čítania a zápisu pre volatilnú premennú (vrátane long a double) sú atómové operácie.
- Atómové metódy sú dostupné v balíku java.util.Concurrent.
40) Čo je rozhranie zámku v Concurrency API v Jave?
Ako mechanizmus synchronizácie sa používa rozhranie java.util.concurrent.locks.Lock. Funguje podobne ako synchronizovaný blok. Existuje niekoľko rozdielov medzi zámkom a synchronizovaným blokom, ktoré sú uvedené nižšie.
- Rozhranie zámku poskytuje garanciu poradia, v ktorom čakacie vlákno dostane prístup, zatiaľ čo synchronizovaný blok to nezaručuje.
- Rozhranie zámku poskytuje možnosť časového limitu, ak zámok nie je udelený, zatiaľ čo synchronizovaný blok to neposkytuje.
- Metódy rozhrania Lock, t.j. Lock() a Unlock() možno volať rôznymi metódami, zatiaľ čo jeden synchronizovaný blok musí byť plne obsiahnutý v jednej metóde.
41) Vysvetlite rozhranie ExecutorService.
Rozhranie ExecutorService je podrozhraním rozhrania Executor a pridáva funkcie na správu životného cyklu. Zvážte nasledujúci príklad.
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(); } } } }
Výkon
Shutdown executor shutdown finished
42) Aký je rozdiel medzi synchrónnym programovaním a asynchrónnym programovaním, pokiaľ ide o vlákno?
Synchrónne programovanie: V modeli synchrónneho programovania je vlákno priradené na dokončenie úlohy, a preto na ňom vlákno začalo pracovať, a pre ostatné úlohy je dostupné až po ukončení priradenej úlohy.
Asynchrónne programovanie: V asynchrónnom programovaní môže byť jedna úloha dokončená viacerými vláknami, a preto poskytuje maximálnu využiteľnosť rôznych vlákien.
43) Čo rozumiete pod pojmom Callable a Future v jazyku Java?
Rozhranie Java Callable: V Java5 bolo volateľné rozhranie poskytované balíkom java.util.concurrent. Je podobné rozhraniu Runnable, ale môže vrátiť výsledok a môže vyvolať výnimku. Poskytuje tiež metódu run() na vykonanie vlákna. Java Callable môže vrátiť akýkoľvek objekt, pretože používa Generic.
sonu nigam
Syntax:
verejné rozhranie Volateľné
Rozhranie Java Future: Rozhranie Java Future poskytuje výsledok súbežného procesu. Rozhranie Callable vracia objekt java.util.concurrent.Future.
Java Future poskytuje nasledujúce metódy implementácie.
44. Aký je rozdiel medzi rozhraním ScheduledExecutorService a ExecutorService?
ExecutorServcie a ScheduledExecutorService sú rozhrania balíka java.util.Concurrent, ale naplánovanáExecutorService poskytuje niektoré ďalšie metódy na spustenie úloh Runnable a Callable s oneskorením alebo v každom pevnom časovom období.
45) Definujte triedu FutureTask v jazyku Java?
Java trieda FutureTask poskytuje základnú implementáciu rozhrania budúcnosti. Výsledok je možné získať iba vtedy, ak je vykonanie jednej úlohy dokončené, a ak sa výpočet nedosiahne, metóda get bude zablokovaná. Ak je vykonanie dokončené, nemožno ho znova spustiť a nemožno ho zrušiť.
Syntax
public class FutureTask rozširuje Object implementuje RunnableFuture
10;>