logo

„Java“ kelių gijų ir lygiagretumo interviu klausimai

Daugialypės gijos ir sinchronizavimas yra laikomi tipišku Java programavimo skyriumi. Žaidimų kūrimo įmonėse dažniausiai užduodami interviu klausimai, susiję su daugybe gijų. Toliau pateikiamas dažniausiai užduodamų java daugiasriegių ir lygiagrečių interviu klausimų sąrašas.


Daugiasluoksniai interviu klausimai

1) Kas yra daugiagija?

Kelių gijų kūrimas yra procesas, kai vienu metu vykdomos kelios gijos. Norint gauti daugiafunkcinį darbą, naudojamas kelių gijų naudojimas. Jis sunaudoja mažiau atminties ir užtikrina greitą bei efektyvų veikimą. Pagrindiniai jo pranašumai yra šie:

  • Gijos turi tą pačią adresų erdvę.
  • Siūlas lengvas.
  • Ryšio tarp procesų kaina yra nedidelė.
Daugiau informacijos.

2) Kas yra siūlas?

Siūlas yra lengvas subprocesas. Tai yra atskiras vykdymo kelias, nes kiekviena gija veikia skirtingame kamino rėmelyje. Procesą gali sudaryti kelios gijos. Gijos dalijasi proceso ištekliais, tačiau vis tiek vykdomos nepriklausomai.

Daugiau informacijos.

3) Atskirti procesą ir giją?

Yra šie proceso ir gijos skirtumai.

  • Vykdoma programa vadinama procesu, tuo tarpu; Siūlas yra proceso poaibis
  • Procesai yra nepriklausomi, o gijos yra proceso poaibis.
  • Procesas turi skirtingą adresų erdvę atmintyje, o gijose yra bendra adresų erdvė.
  • Konteksto perjungimas tarp gijų yra greitesnis, palyginti su procesais.
  • Ryšys tarp procesų yra lėtesnis ir brangesnis nei komunikacija tarp gijų.
  • Bet koks pirminio proceso pakeitimas neturi įtakos antriniam procesui, o pirminės gijos pakeitimai gali turėti įtakos antrinei gijai.

4) Ką jūs suprantate kaip bendravimas tarp gijų?

  • Ryšio tarp sinchronizuotų gijų procesas vadinamas komunikavimu tarp gijų.
  • Norint išvengti gijų apklausos „Java“ programoje, naudojamas ryšys tarp gijų.
  • Gijos veikimas kritinėje dalyje pristabdomas, o kitai gijai leidžiama įeiti (arba užrakinti) toje pačioje kritinėje sekcijoje, kuri turi būti vykdoma.
  • Jį galima gauti naudojant laukimo(), notify() ir notifyAll() metodus.

5) Koks yra „wait()“ metodo tikslas „Java“?

Wait() metodą teikia „Java“ Object klasė. Šis metodas naudojamas „Java“ komunikacijai tarp gijų. Java.lang.Object.wait() naudojamas dabartinei gijai pristabdyti ir palaukti, kol kita gija neiškvies notify() arba notifyAll() metodo. Jo sintaksė pateikta žemiau.

viešas galutinis tuščias laukimas ()


6) Kodėl iš sinchronizuoto bloko turi būti iškviestas wait() metodas?

Turime iškviesti laukimo metodą, kitaip jis išmes java.lang.IllegalMonitorStateException išimtis. Be to, mums reikia laukimo () metodo, kad galėtume bendrauti tarp gijų su notify () ir notifyAll (). Todėl jis turi būti sinchronizuotame bloke, kad būtų galima tinkamai ir teisingai bendrauti.


7) Kokie yra kelių gijų privalumai?

Kelių gijų programavimas turi šiuos privalumus:

  • Kelių gijų naudojimas leidžia programai / programai visada būti aktyviam įvedimui, net jei ji jau veikia atliekant kai kurias fonines užduotis
  • Kelių gijų naudojimas leidžia greičiau atlikti užduotis, nes gijos vykdomos nepriklausomai.
  • Kelių gijų naudojimas leidžia geriau išnaudoti talpyklą, nes gijos dalijasi bendrais atminties ištekliais.
  • Kelių gijų naudojimas sumažina reikalingo serverio skaičių, nes vienas serveris vienu metu gali vykdyti kelias gijas.

8) Kokios būsenos yra gijos gyvavimo cikle?

Per savo gyvavimo laikotarpį gija gali turėti vieną iš šių būsenų:

    Nauja:Šioje būsenoje Thread klasės objektas sukuriamas naudojant naują operatorių, tačiau gija nėra gyva. Tema neprasideda tol, kol neiškviečiame start() metodo.Galima paleisti:Šioje būsenoje gija yra paruošta paleisti iškvietus start() metodą. Tačiau gijos planavimo priemonė dar nepasirinko.Bėga:Šioje būsenoje gijų planavimo priemonė parenka giją iš parengties būsenos ir gija veikia.Laukiama / užblokuota:Šioje būsenoje gija neveikia, bet vis dar gyva arba laukia, kol baigsis kita gija.Mirė / nutraukta:Kai baigiamas vykdyti () metodas, gija yra baigtos arba negyvos būsenos.

9) Kuo skiriasi prevencinis planavimas ir laiko skirstymas?

Taikant prevencinį planavimą, aukščiausio prioriteto užduotis vykdoma tol, kol ji patenka į laukiančią arba neveikiančią būseną arba atsiranda aukštesnio prioriteto užduotis. Skaičiuojant laiką, užduotis vykdoma iš anksto nustatytą laiko atkarpą ir vėl patenka į paruoštų užduočių telkinį. Tada planuotojas nustato, kuri užduotis turi būti vykdoma toliau, atsižvelgdama į prioritetą ir kitus veiksnius.


10) Kas yra konteksto perjungimas?

Konteksto perjungimo metu proceso (arba gijos) būsena išsaugoma, kad ją būtų galima atkurti ir vėliau tęsti vykdymą iš to paties taško. Konteksto perjungimas leidžia keliems procesams dalytis tuo pačiu CPU.


11) Atskirti Thread klasę ir Runnable sąsają kuriant giją?

Giją galima sukurti dviem būdais.

  • Išplėsdami gijų klasę
  • Įdiegus Runnable sąsają

Tačiau pagrindiniai skirtumai tarp abiejų būdų pateikiami toliau:

  • Išplėsdami Thread klasę, negalime išplėsti jokios kitos klasės, nes Java neleidžia kelių paveldėjimo būdų, kai įdiegiama Runnable sąsaja; Taip pat galime išplėsti kitą bazinę klasę (jei reikia).
  • Išplėtus Thread klasę, kiekviena gija sukuria unikalų objektą ir susieja su juo įgyvendindama Runnable sąsają; kelios gijos dalijasi tuo pačiu objektu
  • Thread klasė pateikia įvairius integruotus metodus, tokius kaip getPriority (), isAlive ir daugelis kitų, o Runnable sąsaja suteikia vieną metodą, ty run ().

12) Ką reiškia prisijungimo () metodas?

Join() metodas laukia, kol gija numirs. Kitaip tariant, dėl to šiuo metu veikiančios gijos nustoja vykdyti, kol gija, su kuria ji prisijungia, atliks savo užduotį. Sujungimo metodas yra perkrautas Thread klasėje šiais būdais.

  • public void join()metimai InterruptedException
  • public void prisijungti (ilgos milisekundės) metimai InterruptedException
Daugiau informacijos.

13) Apibūdinkite miego() metodo paskirtį ir veikimą.

Sleep () metodas Java yra naudojamas blokuoti giją tam tikrą laiką, o tai reiškia, kad jis pristabdo gijos vykdymą tam tikram laikui. Yra du būdai tai padaryti.

Sintaksė:

css komentaras
  • viešas statinis tuščias miegas (ilgos milisekundės) metimai InterruptedException
  • viešas statinis tuščias miegas (ilgos milisekundės, int nanos) metimai InterruptedException

Miego() metodo veikimas

galutinis raktinis žodis java

Kai iškviečiame miego () metodą, jis pristabdo dabartinės gijos vykdymą tam tikram laikui ir suteikia pirmenybę kitai gijai (jei yra). Be to, pasibaigus laukimo laikui, ankstesnė gija pakeičia savo būseną iš laukimo į paleidžiamą ir pereina į veikimo būseną, o visas procesas veikia taip toliau, kol vykdymas nebaigtas.


14) Kuo skiriasi laukimo () ir miego () metodas?

laukti()miegoti ()
1) Wait() metodas yra apibrėžtas objektų klasėje.Sleep() metodas yra apibrėžtas Thread klasėje.
2) Palauk() metodas atleidžia užraktą.Sleep() metodas neatleidžia užrakto.

15) Ar galima temą pradėti du kartus?

Ne, negalime iš naujo paleisti gijos, nes pradėjus ir įvykdžius giją, ji pereina į negyvos būseną. Todėl, jei bandysime pradėti giją du kartus, ji duos runtimeException 'java.lang.IllegalThreadStateException'. Apsvarstykite toliau pateiktą pavyzdį.

 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(); } } 

Išvestis

 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) 
Daugiau informacijos.

16) Ar galime iškviesti run() metodą vietoj start()?

Taip, tiesioginis run() metodo iškvietimas galioja, bet jis neveiks kaip gija, o veiks kaip įprastas objektas. Nebus konteksto perjungimo tarp gijų. Kai iškviečiame start() metodą, jis viduje iškviečia metodą run(), kuris sukuria naują gijos krūvą, o tiesiogiai iškviečiant run() naujo dėklo nesukurs.

Daugiau informacijos.

17) O kaip su demonų gijomis?

Demono gijos yra žemo prioriteto gijos, kurios teikia foninį palaikymą ir paslaugas vartotojo gijomis. JVM automatiškai nutraukia demono giją, jei programa lieka tik su demono gija, o visos kitos vartotojo gijos yra baigtos / išnykusios. Gijų klasėje yra du demono gijos metodai:

    public void setDaemon (bulio būsena):Jis naudojamas gijos demono gijai arba vartotojo gijai pažymėti.viešoji loginė isDaemon():Jis patikrina, ar gija yra demonas, ar ne.
Daugiau informacijos.

18) Ar galime vartotojo giją padaryti kaip demono giją, jei gija paleidžiama?

Ne, jei tai padarysite, bus paleista IllegalThreadStateException. Todėl demono giją galime sukurti tik prieš pradėdami giją.

 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. } } 

Išvestis

 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) 
Daugiau informacijos.

19) Kas yra išjungimo kabliukas?

Išjungimo kabliukas yra gija, kuri netiesiogiai iškviečiama prieš JVM išsijungiant. Taigi galime jį naudoti norėdami išvalyti išteklius arba išsaugoti būseną, kai JVM išsijungia įprastai arba staiga. Išjungimo kabliuką galime pridėti naudodami šį metodą:

 public�void�addShutdownHook(Thread�hook){}�� Runtime r=Runtime.getRuntime(); r.addShutdownHook(new MyThread()); 

Keletas svarbių dalykų, susijusių su išjungimo kabliais:

  • Išjungimo kabliukai inicijuojami, tačiau juos galima paleisti tik išjungus JVM.
  • Išjungimo kabliukai yra patikimesni nei finalizer(), nes yra labai mažesnė tikimybė, kad išjungimo kabliukai nepaleis.
  • Išjungimo kabliuką galima sustabdyti iškviečiant vykdymo klasės halt(int) metodą.
Daugiau informacijos.

20) Kada turėtume nutraukti giją?

Turėtume nutraukti giją, kai norime nutraukti gijos miego arba laukimo būseną. Galime nutraukti giją iškviesdami interrupt()�mesdami InterruptedException.

Daugiau informacijos.

21) Kas yra sinchronizavimas?

Sinchronizavimas yra galimybė valdyti kelių gijų prieigą prie bet kurio bendrinamo šaltinio. Jis naudojamas:


  1. Kad būtų išvengta siūlų trukdžių.
  2. Siekiant išvengti nuoseklumo problemų.

Kai kelios gijos bando atlikti tą pačią užduotį, yra klaidingo rezultato tikimybė, todėl norint pašalinti šią problemą, „Java“ naudoja sinchronizavimo procesą, leidžiantį vienu metu vykdyti tik vieną giją. Sinchronizuoti galima trimis būdais:

  • sinchronizuotu metodu
  • pagal sinchronizuotą bloką
  • statinio sinchronizavimo būdu

Sinchronizuoto bloko sintaksė

 synchronized(object reference expression) { //code block } 
Daugiau informacijos.

22) Koks yra sinchronizuoto bloko tikslas?

Sinchronizuotas blokas gali būti naudojamas sinchronizuoti bet kuriame konkrečiame metodo šaltinyje. Tam tikrame šaltinyje vienu metu gali būti vykdoma tik viena gija, o visos kitos gijos, kurios bando patekti į sinchronizuotą bloką, yra blokuojamos.

  • Sinchronizuotas blokas naudojamas užrakinti objektą bet kokiam bendram ištekliui.
  • Sinchronizuoto bloko apimtis apsiriboja bloku, kuriam jis taikomas. Jo taikymo sritis yra mažesnė nei metodo.
Daugiau informacijos.

23) Ar „Java“ objektas gali būti užrakintas tam, kad tam tikra gija galėtų naudoti išskirtinai?

Taip. Objektą galite užrakinti įdėdami jį į „sinchronizuotą“ bloką. Užrakintas objektas nepasiekiamas jokiai kitai gijai, išskyrus tą, kuri jį aiškiai pareiškė.


24) Kas yra statinė sinchronizacija?

Jei bet kurį statinį metodą nustatysite kaip sinchronizuotą, užraktas bus klasėje, o ne objekte. Jei prieš metodą naudosime sinchronizuotą raktinį žodį, jis užrakins objektą (vienu metu objektą gali pasiekti viena gija), bet jei naudosime statinį sinchronizavimą, tai užrakins klasę (viena gija gali pasiekti klasę vienu metu). Daugiau informacijos.


25) Kuo skiriasi notify() ir notifyAll()?

Notify () naudojamas atblokuoti vieną laukiančią giją, o notifyAll () metodas naudojamas atblokuoti visas laukiančias gijas.


26) Kas yra aklavietė?

Aklavietė yra situacija, kai kiekviena gija laukia resurso, kurį laiko kita laukianti gija. Esant tokiai situacijai, nei viena gija nevykdoma, nei ji neturi galimybės būti įvykdyta. Vietoj to, tarp visų gijų egzistuoja visuotinė laukimo būsena. Aklavietė yra labai sudėtinga situacija, kuri gali sulaužyti mūsų kodą vykdymo metu.

Daugiau informacijos.

27) Kaip aptikti aklavietės būseną? Kaip to galima išvengti?

Mes galime aptikti aklavietės būseną, paleidę kodą cmd ir surinkę gijos iškrovimą, o jei kode yra aklavietė, cmd pasirodys pranešimas.

Būdai, kaip išvengti „Java“ aklavietės:

    Venkite įdėto užrakto:Įdėtas užraktas yra dažna aklavietės priežastis, nes aklavietė įvyksta, kai užrakiname įvairias gijas, todėl tam tikru metu turėtume užrakinti tik vieną giją.Venkite nereikalingų užraktų:turime vengti spynų, kurių nereikia.Naudojant gijų sujungimą:Gijos sujungimas padeda laukti gijos, kol kita gija nebaigs jos vykdymo, todėl galime išvengti aklavietės maksimaliai naudojant sujungimo metodą.

28) Kas yra „Java“ gijų planuoklis?

„Java“ programoje, kai sukuriame gijas, jos yra prižiūrimos naudojant gijų planuoklį, kuris yra JVM dalis. Gijų planavimo priemonė yra atsakinga tik už sprendimą, kuri gija turi būti vykdoma. Gijų planuotojas naudoja du gijų planavimo mechanizmus: prevencinį ir laiko pjaustymą.

„Java“ gijų planuoklis taip pat veikia, kad būtų galima nuspręsti dėl šios gijos:
  • Jis pasirenka gijos prioritetą.
  • Jis nustato gijos laukimo laiką
  • Tai patikrina siūlų prigimtį

29) Ar kiekviena gija turi savo krūvą daugiasriegio programavimo metu?

Taip, kelių gijų programavimo metu kiekviena gija išlaiko savo arba atskirą kamino sritį atmintyje, dėl kurios kiekviena gija yra nepriklausoma viena nuo kitos.


30) Kaip užtikrinamas siūlų saugumas?

Jei metodą arba klasės objektą vienu metu gali naudoti kelios gijos be jokių lenktynių sąlygų, tada klasė yra saugi gijai. Siūlų sauga naudojama tam, kad programa būtų saugi naudoti daugiasriegio programavimo metu. Tai galima pasiekti šiais būdais:

  • Sinchronizavimas
  • Naudojant nepastovų raktinį žodį
  • Naudojant užraktu pagrįstą mechanizmą
  • Atominio įvyniojimo klasių naudojimas

31) Kas yra rasės būklė?

Lenktynių sąlyga yra problema, atsirandanti kelių gijų programuojant, kai vienu metu vykdomos įvairios gijos, kurios tuo pačiu metu pasiekia bendrinamą išteklių. Tinkamai naudojant sinchronizavimą galima išvengti lenktynių būsenos.


32) Kas yra nepastovus java raktinis žodis?

Nepastovus raktinis žodis naudojamas daugiasriegiame programavime, kad būtų užtikrintas gijų saugumas, nes vieno nepastovaus kintamojo pasikeitimas matomas visoms kitoms gijomis, todėl vieną kintamąjį vienu metu gali naudoti viena gija.


33) Ką jūs suprantate kaip siūlų telkinys?

  • „Java Thread Pool“ yra darbuotojų gijų grupė, kuri laukia, kol bus paskirstyta užduotis.
  • Gijų telkinyje esančias gijas prižiūri paslaugų teikėjas, kuris ištraukia vieną giją iš telkinio ir priskiria jai užduotį.
  • Atlikus duotą užduotį, siūlai vėl pateko į gijų telkinį.
  • Gijų telkinio dydis priklauso nuo bendro gijų, laikomų rezerve vykdymui, skaičiaus.

Siūlų baseino pranašumai yra šie:

  • Naudojant siūlų telkinį, galima pagerinti našumą.
  • Naudojant siūlų telkinį, gali būti geresnis sistemos stabilumas.

Interviu lygiagrečiai klausimai

34) Kokie yra pagrindiniai lygiagrečiojo API komponentai?

Concurrency API galima sukurti naudojant java.util.Concurrent paketo klasę ir sąsajas. Java.util.Concurrent pakete yra šios klasės ir sąsajos.

  • Vykdytojas
  • FarkJoinPool
  • Vykdytojo paslauga
  • ScheduledExecutorService
  • Ateitis
  • Laiko vienetas (enum)
  • CountDownLatch
  • CyclicBarrier
  • Semaforas
  • ThreadFactory
  • Blokavimo eilė
  • DelayQueue
  • Spynos
  • Fazeris

35) Kas yra „Java“ programos „Concurrency API“ vykdytojo sąsaja?

Vykdytojo sąsaja, kurią teikia paketas java.util.concurrent, yra paprasta sąsaja, naudojama naujai užduočiai vykdyti. Vykdytojo sąsajos metodas execute() naudojamas tam tikrai komandai vykdyti. Metodo execute() sintaksė pateikta žemiau.

void execute (vykdoma komanda)

Apsvarstykite šį pavyzdį:

 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(); } } } } 

Išvestis

nelygus sumavimas
 Running Thread! Thread Completed 

36) Kas yra BlockingQueue?

Java.util.concurrent.BlockingQueue yra eilės antrinė sąsaja, palaikanti tokias operacijas, kaip laukimas, kol bus laisvos vietos, prieš įterpiant naują reikšmę arba laukimas, kol eilė taps tuščia, prieš nuskaitant elementą iš jos. Apsvarstykite toliau pateiktą pavyzdį.

 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(); } } } } 

Išvestis

 Added: 96 Removed: 96 Added: 8 Removed: 8 Added: 5 Removed: 5 

37) Kaip įgyvendinti gamintojo-vartotojo problemą naudojant BlockingQueue?

Gamintojo ir vartotojo problemą galima išspręsti naudojant BlockingQueue tokiu būdu.

 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&apos;t guarantee it.</li> <li>Lock interface provides the option of timeout if the lock is not granted whereas the synchronized block doesn&apos;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(&apos;Shutdown executor&apos;); e.shutdown(); e.awaitTermination(5, TimeUnit.SECONDS); } catch (InterruptedException ex) { System.err.println(&apos;tasks interrupted&apos;); } finally { if (!e.isTerminated()) { System.err.println(&apos;cancel non-finished tasks&apos;); } e.shutdownNow(); System.out.println(&apos;shutdown finished&apos;); } } static class Task implements Runnable { public void run() { try { Long duration = (long) (Math.random() * 20); System.out.println(&apos;Running Task!&apos;); 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&#xFFFD;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&apos;t be canceled.</p> <p> <strong>Syntax</strong> </p> <p>public class FutureTask extends Object implements RunnableFuture</p> <hr></10;>

38) Kuo skiriasi „Java Callable“ sąsaja ir paleidžiama sąsaja?

Iškviečiamą sąsają ir paleidžiamą sąsają naudoja klasės, kurios norėjo vykdyti su keliomis gijomis. Tačiau tarp jų yra du pagrindiniai skirtumai:

  • Iškviečiama sąsaja gali pateikti rezultatą, o paleidžiama sąsaja negali pateikti jokio rezultato.
  • Iškviečiama sąsaja gali pateikti pažymėtą išimtį, o paleidžiama sąsaja negali pateikti pažymėtos išimties.
  • Iškviečiamos sąsajos negalima naudoti anksčiau nei „Java 5“, tuo tarpu galima naudoti „Runnable“ sąsają.

39) Kas yra „Atomic“ veiksmas „Java“ programoje „Concurrency“?

  • Atominis veiksmas yra operacija, kurią galima atlikti viename užduoties vienete, netrukdant kitoms operacijoms.
  • Atominis veiksmas negali būti sustabdytas tarp užduočių. Pradėjus pildyti, jis sustoja tik atlikus užduotį.
  • Didinimo operacija, tokia kaip a++, neleidžia atlikti atominio veiksmo.
  • Visos primityvaus kintamojo skaitymo ir rašymo operacijos (išskyrus ilgą ir dvigubą) yra atominės operacijos.
  • Visos nepastoviojo kintamojo skaitymo ir rašymo operacijos (įskaitant ilgą ir dvigubą) yra atominės operacijos.
  • Atomic metodus galima rasti java.util.Concurrent pakete.

40) Kas yra „Java“ „Concurrency API“ užrakto sąsaja?

Java.util.concurrent.locks.Lock sąsaja naudojama kaip sinchronizavimo mechanizmas. Jis veikia panašiai kaip sinchronizuotas blokas. Yra keletas skirtumų tarp užrakto ir sinchronizuoto bloko, kurie pateikiami toliau.

  • Užrakto sąsaja garantuoja seką, kurioje laukiančiai gijai bus suteikta prieiga, o sinchronizuotas blokas to negarantuoja.
  • Užrakto sąsaja suteikia skirtojo laiko parinktį, jei užraktas nesuteikiamas, o sinchronizuotas blokas to nenumato.
  • Užrakinimo sąsajos metodai, ty Lock () ir Unlock () gali būti iškviesti skirtingais metodais, tuo tarpu vienas sinchronizuotas blokas turi būti visiškai įtrauktas į vieną metodą.

41) Paaiškinkite ExecutorService sąsają.

„ExecutorService“ sąsaja yra „Executor“ sąsajos antrinė sąsaja ir prideda funkcijų, skirtų valdyti gyvavimo ciklą. Apsvarstykite toliau pateiktą pavyzdį.

 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(&apos;Shutdown executor&apos;); e.shutdown(); e.awaitTermination(5, TimeUnit.SECONDS); } catch (InterruptedException ex) { System.err.println(&apos;tasks interrupted&apos;); } finally { if (!e.isTerminated()) { System.err.println(&apos;cancel non-finished tasks&apos;); } e.shutdownNow(); System.out.println(&apos;shutdown finished&apos;); } } static class Task implements Runnable { public void run() { try { Long duration = (long) (Math.random() * 20); System.out.println(&apos;Running Task!&apos;); TimeUnit.SECONDS.sleep(duration); } catch (InterruptedException ex) { ex.printStackTrace(); } } } } 

Išvestis

 Shutdown executor shutdown finished 

42) Kuo skiriasi sinchroninis programavimas nuo asinchroninio programavimo gijos atžvilgiu?

Sinchroninis programavimas: Sinchroninio programavimo modelyje gija priskiriama užduočiai atlikti, todėl gija pradėjo ją vykdyti, o kitoms užduotims ji pasiekiama tik baigus priskirtą užduotį.

Asinchroninis programavimas: Taikant asinchroninį programavimą, vieną užduotį galima atlikti keliomis gijomis, taigi tai užtikrina maksimalų įvairių gijų naudojimą.


43) Ką jūs suprantate iš „Callable“ ir „Future“ programoje „Java“?

Java skambinimo sąsaja: Java5 iškviečiamą sąsają suteikė paketas java.util.concurrent. Jis panašus į Runnable sąsają, bet gali grąžinti rezultatą ir pateikti išimtį. Jame taip pat pateikiamas metodas „run()“ gijos vykdymui. „Java Callable“ gali grąžinti bet kokį objektą, nes naudoja „Generic“.

Sintaksė:

viešoji sąsaja Galima iškviesti

kas yra obj java

„Java Future“ sąsaja: „Java Future“ sąsaja pateikia tuo pačiu metu vykstančio proceso rezultatą. Iškviečiama sąsaja grąžina java.util.concurrent.Future objektą.

„Java Future“ pateikia šiuos diegimo būdus.

    atšaukti (bulio vertė�gali nutraukti, jei paleista):Jis naudojamas priskirtos užduoties vykdymui atšaukti.gauti ():Jis laukia laiko, jei vykdymas nebaigtas, ir tada nuskaito rezultatą.isCanceled ():Jis grąžina Būlio reikšmę, nes ji grąžina teisingą, jei užduotis buvo atšaukta prieš ją užbaigiant.yra padaryta():Grąžina teisinga, jei užduotis baigta sėkmingai, kitu atveju grąžinama klaidinga.

44. Kuo skiriasi ScheduledExecutorService ir ExecutorService sąsaja?

„ExecutorServcie“ ir „ScheduledExecutorService“ yra „java.util.Concurrent“ paketo sąsajos, tačiau „scheduldExecutorService“ pateikia keletą papildomų metodų, leidžiančių vykdyti vykdomas ir iškviečiamas užduotis su uždelsimu arba kiekvieną fiksuotą laikotarpį.

45) Apibrėžti FutureTask klasę Java?

Java FutureTask klasė suteikia pagrindinį ateities sąsajos įgyvendinimą. Rezultatas gali būti gautas tik tada, kai bus atlikta viena užduotis, o jei skaičiavimas nepasiekiamas, metodas get bus užblokuotas. Jei vykdymas baigtas, jo negalima pradėti iš naujo ir atšaukti.

Sintaksė

viešoji klasė FutureTask išplečia Objektą įgyvendina RunnableFuture