CodeGym /Blog Jawa /Acak /Njelajah pitakonan lan jawaban saka wawancara proyek kang...
John Squirrels
tingkat
San Francisco

Njelajah pitakonan lan jawaban saka wawancara proyek kanggo posisi pangembang Jawa. Bagean 12

Diterbitake ing grup
Hi! Kawruh iku daya. Luwih akeh kawruh sing sampeyan duwe ing wawancara pisanan, luwih yakin sampeyan bakal rumangsa. Njelajah pitakonan lan jawaban saka wawancara proyek kanggo posisi pangembang Jawa.  Bagean 12 - 1Yen sampeyan nggawa otak gedhe sing kebak kawruh, pewawancara bakal angel mbingungake sampeyan lan bisa uga kaget. Dadi tanpa ado maneh, dina iki kita bakal terus nguatake basis teori sampeyan kanthi mriksa pitakonan kanggo pangembang Jawa.

103. Aturan apa sing ditrapake kanggo mriksa pengecualian sajrone warisan?

Yen aku ngerti pitakonan kanthi bener, dheweke takon babagan aturan kanggo nggarap pangecualian sajrone warisan. Aturan sing relevan kaya ing ngisor iki:
  • Cara sing ditindhes utawa dileksanakake ing turunan / implementasine ora bisa mbuwang pangecualian sing dicenthang sing luwih dhuwur ing hirarki tinimbang pangecualian ing superclass / metode antarmuka.
Contone, umpamane kita duwe sawetara antarmuka Animal kanthi metode sing mbuwang IOException :
public interface Animal {
   void speak() throws IOException;
}
Nalika ngleksanakake antarmuka iki, kita ora bisa mbabarake pangecualian sing luwih umum sing bisa dibuang (eg Exception , Throwable ), nanging kita bisa ngganti pangecualian sing ana karo subkelas, kayata FileNotFoundException :
public class Cat implements Animal {
   @Override
   public void speak() throws FileNotFoundException {
// Some implementation
   }
}
  • Klausa uncalan konstruktor subclass kudu kalebu kabeh kelas pangecualian sing dibuwang dening konstruktor superclass sing diarani nggawe obyek kasebut.
Upaminipun konstruktor kelas Animal mbuwang akeh pengecualian:
public class Animal {
  public Animal() throws ArithmeticException, NullPointerException, IOException {
  }
Banjur konstruktor subclass uga kudu mbuwang:
public class Cat extends Animal {
   public Cat() throws ArithmeticException, NullPointerException, IOException {
       super();
   }
Utawa, kaya cara, sampeyan bisa nemtokake beda, pangecualian sing luwih umum. Ing kasus kita, kita bisa nunjukake Exception , amarga luwih umum lan minangka leluhur umum saka kabeh telung pengecualian sing dituduhake ing superclass:
public class Cat extends Animal {
   public Cat() throws Exception {
       super();
   }

104. Sampeyan bisa nulis sawetara kode ing ngendi blok pungkasan ora dieksekusi?

Pisanan, ayo elinga apa pungkasane . Sadurungé, kita mriksa mekanisme penangkapan pangecualian: pemblokiran nyoba nemtokake pangecualian sing bakal kejiret, lan pemblokiran nyekel minangka kode sing bakal dijaluk nalika pangecualian sing cocog kejiret . Blok kode katelu sing ditandhani karo tembung kunci pungkasan bisa ngganti utawa teka sawise blok nyekel. Ing idea konco pemblokiran iki sing kode tansah kaleksanan preduli saka apa mengkono ing nyoba utawa nyekel pemblokiran (preduli saka ana pangecualian utawa ora). Kedadeyan, ing ngendi blok iki ora dieksekusi arang banget lan ora normal. Conto sing paling gampang yaiku nalika System.exit (0) diarani sadurunge pamblokiran pungkasan, saéngga mungkasi program kasebut:
try {
   throw new IOException();
} catch (IOException e) {
   System.exit(0);
} finally {
   System.out.println("This message will not be printed on the console");
}
Ana uga sawetara kahanan liyane ing ngendi blok pungkasan ora bakal mbukak:
  • Contone, mandap program ora normal disebabake kasalahan sistem kritis, utawa sawetara kesalahan sing nimbulaké aplikasi kanggo kacilakan (contone, StackOverflowError , sing occurs nalika tumpukan aplikasi overflowed).

  • Kahanan liyane yaiku nalika benang daemon mlebu blok nyoba-akhire , nanging benang utama program mandheg. Sawise kabeh, utas daemon kanggo karya latar mburi sing ora prioritas dhuwur utawa prentah, supaya aplikasi ora ngenteni rampung.

  • Conto sing paling ora ana gunane yaiku puteran tanpa wates ing blok coba utawa nyekel - yen ana ing njero, benang bakal macet ing salawas-lawase:

    try {
       while (true) {
       }
    } finally {
       System.out.println("This message will not be printed on the console");
    }
Pitakonan iki populer banget ing wawancara pangembang junior, mula luwih becik ngelingi sawetara kahanan sing luar biasa kasebut. Njelajah pitakonan lan jawaban saka wawancara proyek kanggo posisi pangembang Jawa.  Bagean 12 - 2

105. Tulis conto ing ngendi sampeyan nangani sawetara pengecualian ing blok nyekel siji.

1) Aku ora yakin pitakonan iki ditakoni kanthi bener. Sa adoh aku ngerti, pitakonan iki nuduhake sawetara pamblokiran nyekel lan nyoba siji :
try {
  throw new FileNotFoundException();
} catch (FileNotFoundException e) {
   System.out.print("Oops! There was an exception: " + e);
} catch (IOException e) {
   System.out.print("Oops! There was an exception: " + e);
} catch (Exception e) {
   System.out.print("Oops! There was an exception: " + e);
}
Yen pangecualian dibuwang ing blok coba , banjur blok nyekel sing gegandhengan nyoba nyekel, kanthi urutan saka ndhuwur nganti ngisor. Sawise pangecualian cocog karo salah sawijining blok tangkapan , blok sing isih ana ora bakal bisa nyekel lan nangani. Iki kabeh tegese pangecualian sing luwih sempit disusun ing ndhuwur sing luwih umum ing set blok nyekel . Contone, yen pamblokiran tangkapan pisanan kita nyekel kelas Pengecualian , mula blok sabanjure ora bakal nyekel pangecualian sing dicenthang (yaiku, blok sing isih ana karo subkelas Pengecualian bakal ora ana gunane). 2) Utawa mbok menawa pitakonan kasebut ditakoni kanthi bener. Ing kasus kasebut, kita bisa nangani pengecualian kaya ing ngisor iki:
try {
  throw new NullPointerException();
} catch (Exception e) {
   if (e instanceof FileNotFoundException) {
       // Some handling that involves a narrowing type conversion: (FileNotFoundException)e
   } else if (e instanceof ArithmeticException) {
       // Some handling that involves a narrowing type conversion: (ArithmeticException)e
   } else if(e instanceof NullPointerException) {
       // Some handling that involves a narrowing type conversion: (NullPointerException)e
   }
Sawise nggunakake nyekel kanggo nyekel pangecualian, kita banjur nyoba nemokake jinis tartamtu kanthi nggunakake operator instanceof , sing mriksa apa obyek kalebu jinis tartamtu. Iki ngidini kita kanthi yakin nindakake konversi jinis sing sempit tanpa wedi akibat negatif. Kita bisa nggunakake salah siji pendekatan ing kahanan sing padha. Aku nyatakake keraguan babagan pitakonan kasebut mung amarga aku ora bakal nelpon pilihan kapindho minangka pendekatan sing apik. Ing pengalaman, aku ora tau nemoni, lan pendekatan pisanan sing nglibatake pirang-pirang blok nyekel nyebar.

106. Kang operator ngijini sampeyan meksa pangecualian kanggo di buwang? Tulis tuladha

Aku wis digunakake kaping pirang-pirang ing conto ing ndhuwur, nanging aku bakal mbaleni maneh: tembung kunci uncalan . Conto mbuwang pengecualian kanthi manual:
throw new NullPointerException();

107. Apa cara utama bisa mbuwang pengecualian? Yen mangkono, banjur menyang ngendi?

Kaping pisanan, aku pengin nyathet yen metode utama ora luwih saka cara biasa. Ya, diarani mesin virtual kanggo miwiti eksekusi program, nanging ngluwihi, bisa diarani saka kode liyane. Tegese uga tundhuk karo aturan biasa babagan nuduhake pangecualian sing dicenthang sawise tembung kunci mbuwang :
public static void main(String[] args) throws IOException {
Patut, iku bisa uncalan pangecualian. Nalika utama diarani minangka titik wiwitan program (tinimbang karo sawetara cara liyane), banjur sembarang pangecualian sing dibuwang bakal ditangani dening UncaughtExceptionHandler . Saben utas duwe siji pawang (yaiku, ana siji pawang ing saben utas). Yen perlu, sampeyan bisa nggawe handler dhewe lan nyetel kanthi nelpon umum statis void utama (String [] args) mbalang IOException {setDefaultUncaughtExceptionHandler metode ing umum statis roso sepi utama (String [] args) mbalang IOException {Thread obyek.

Multithreading

Njelajah pitakonan lan jawaban saka wawancara proyek kanggo posisi pangembang Jawa.  Bagean 12 - 3

108. Apa mekanisme kanggo nggarap lingkungan multithreaded sing sampeyan ngerti?

Mekanisme dhasar kanggo multithreading ing Jawa yaiku:
  • Tembung kunci sing disinkronake , yaiku cara thread kanggo ngunci cara / pamblokiran nalika mlebu, nyegah thread liyane mlebu.

  • Tembung kunci molah malih njamin akses konsisten menyang variabel diakses dening Utas beda. Yaiku, nalika modifier iki ditrapake kanggo variabel, kabeh operasi kanggo nemtokake lan maca variabel kasebut dadi atom. Ing tembung liyane, benang ora bakal nyalin variabel menyang memori lokal lan ngganti. Dheweke bakal ngganti nilai asline.

  • Runnable - Kita bisa ngleksanakake antarmuka iki (sing kasusun saka cara run () siji ) ing sawetara kelas:

    public class CustomRunnable implements Runnable {
       @Override
       public void run() {
           // Some logic
       }
    }

    Lan yen kita nggawe obyek saka kelas kasebut, kita bisa miwiti thread anyar kanthi ngirim obyek menyang konstruktor Utas banjur nelpon metode wiwitan () :

    Runnable runnable = new CustomRunnable();
    new Thread(runnable).start();

    Cara wiwitan mbukak cara dileksanakake run () ing thread kapisah.

  • Utas - Kita bisa marisi kelas iki lan ngganti cara mlaku :

    public class CustomThread extends Thread {
       @Override
       public void run() {
           // Some logic
       }
    }

    Kita bisa miwiti thread anyar kanthi nggawe obyek saka kelas iki banjur nelpon cara wiwitan () :

    new CustomThread().start();

  • Concurrency - Iki minangka paket alat kanggo nggarap lingkungan multithreaded.

    Iku kasusun saka:

    • Koleksi Concurrent - Iki minangka koleksi koleksi sing digawe kanthi jelas kanggo digunakake ing lingkungan multithreaded.

    • Antrian - Antrian khusus kanggo lingkungan multithreaded (blocking lan non-blocking).

    • Sinkronisasi - Iki minangka alat khusus kanggo nggarap lingkungan multithreaded.

    • Executors - Mekanisme kanggo nggawe pools thread.

    • Kunci - Mekanisme sinkronisasi benang sing luwih fleksibel tinimbang sing standar (nyelarasake, ngenteni, notifikasi, notifyAll).

    • Atomics - Kelas sing dioptimalake kanggo multithreading. Saben operasi iku atom.

109. Marang kita bab sinkronisasi antarane Utas. Apa sing Enteni (), notify (), notifyAll (), lan gabung () cara kanggo?

Sinkronisasi ing antarane benang yaiku babagan tembung kunci sing disinkronake . Modifier iki bisa diselehake langsung ing blok:
synchronized (Main.class) {
   // Some logic
}
Utawa langsung ing tandha cara:
public synchronized void move() {
   // Some logic }
Kaya sing dakkandhakake sadurunge, sinkronisasi minangka mekanisme kanggo ngunci blok / metode menyang benang liyane nalika siji benang mlebu. Ayo dipikirake blok kode / metode minangka kamar. Sawetara benang nyedhaki kamar, mlebu, lan ngunci lawang nganggo kunci. Nalika benang liyane nyedhaki kamar, dheweke weruh yen lawang dikunci lan ngenteni ing cedhak nganti kamar kasedhiya. Sawise utas pisanan rampung karo bisnis ing kamar, mbukak kunci lawang, metu saka kamar, lan ngeculake tombol. Aku wis nyebutake tombol kaping pirang-pirang kanthi alesan - amarga ana sing analog. Iki minangka obyek khusus sing nduweni status sibuk / bebas. Saben obyek ing Jawa duwe obyek kasebut, mula nalika nggunakake blok sing disinkronake , kita kudu nggunakake tanda kurung kanggo nuduhake obyek sing mutex bakal dikunci:
Cat cat = new Cat();
synchronized (cat) {
   // Some logic
}
Kita uga bisa nggunakake mutex gadhah kelas, kaya aku ing conto pisanan ( Main.class ). Sawise kabeh, nalika nggunakake cara sing disinkronake , kita ora nemtokake obyek sing pengin dikunci, ta? Ing kasus iki, kanggo metode non-statis, mutex sing bakal dikunci yaiku obyek iki , yaiku obyek kelas saiki. Kanggo cara statis, mutex digandhengake karo kelas saiki ( this.getClass (); ) dikunci. ngenteni () iku sawijining cara sing mbebasake mutex lan nempatno thread saiki menyang negara nunggu, kaya nempel ing monitor saiki (kaya anchor). Amarga iki, cara iki mung bisa diarani saka blok utawa metode sing disinkronake . Yen ora, apa sing bakal ditunggu lan apa sing bakal dirilis?). Uga elinga yen iki minangka metode kelas Obyek . Ora siji, nanging telu:
  • ngenteni () nempatno thread saiki menyang negara nunggu nganti thread liyane nelpon notify () utawa notifyAll () cara ing obyek iki (kita bakal pirembagan bab cara iki mengko).

  • ngenteni (wektu entek dawa) nempatno thread saiki menyang negara nunggu nganti thread liyane nelpon notify () utawa notifyAll () cara ing obyek iki utawa interval wektu sing ditemtokake dening wektu entek kadaluwarsa.

  • ngenteni (wektu entek dawa, int nanos) kaya cara sadurunge, nanging ing kene nano ngidini sampeyan nemtokake nanodetik (wektu entek sing luwih tepat).

  • notify () ngijini sampeyan tangi siji thread acak nunggu ing pamblokiran sinkronisasi saiki. Maneh, cara iki mung bisa diarani ing blok utawa metode sing disinkronake (sawise kabeh, ing papan liya ora bakal ana sing tangi).

  • notifyAll () awakens kabeh Utas nunggu ing monitor saiki (uga mung digunakake ing pemblokiran diselarasake utawa cara).

110. Kepiye carane mungkasi thread?

Wangsulan: Bab ingkang sapisanan ngandika kene iku nalika roto () mbukak kanggo completion, Utas mungkasi kanthi otomatis. Nanging kadhangkala kita pengin mateni thread sadurunge jadwal, sadurunge cara rampung. Dadi apa sing kudu kita lakoni? Mbok kita bisa nggunakake cara mandeg () ing obyek Utas ? Ora! Cara kasebut ora digunakake lan bisa nyebabake kacilakan sistem. Njelajah pitakonan lan jawaban saka wawancara proyek kanggo posisi pangembang Jawa.  Bagean 12 - 4Nah, banjur apa? Ana rong cara kanggo nindakake iki: Kaping pisanan , gunakake gendera boolean internal. Ayo katon ing conto. Kita duwe implementasine utas sing kudu nampilake frasa tartamtu ing layar nganti benang mandheg:
public class CustomThread extends Thread {
private boolean isActive;

   public CustomThread() {
       this.isActive = true;
   }

   @Override
   public void run() {
       {
           while (isActive) {
               System.out.println("The thread is executing some logic...");
           }
           System.out.println("The thread stopped!");
       }
   }

   public void stopRunningThread() {
       isActive = false;
   }
}
Nelpon cara stopRunningThread () mranata gendéra internal palsu, nyebabake cara roto () kanggo siksa. Ayo diarani ing utama :
System.out.println("Program starting...");
CustomThread thread = new CustomThread();
thread.start();
Thread.sleep(3);
// As long as our main thread is asleep, our CustomThread runs and prints its message on the console
thread.stopRunningThread();
System.out.println("Program stopping...");
Akibaté, kita bakal weruh kaya iki ing konsol:
Program diwiwiti... Utas nglakokaké sawetara logika... Utas nglakokaké sawetara logika... Utas nglakokaké sawetara logika... Utas nglakokaké sawetara logika... Utas nglakokaké sawetara logika... Utas nindakake sawetara logika... Program mandheg... Utas mandheg!
Tegese utas kita diwiwiti, nyithak sawetara pesen ing konsol, banjur kasil mandheg. Elinga yen jumlah pesen sing ditampilake bakal beda-beda saka peluncuran nganti diluncurake. Lan kadhangkala benang tambahan bisa uga ora nampilake apa-apa. Prilaku tartamtu gumantung suwene benang utama turu. Suwene turu, luwih sithik yen benang tambahan ora bisa nampilake apa-apa. Kanthi wektu turu 1 ms, sampeyan ora bakal bisa ndeleng pesen kasebut. Nanging yen sampeyan nyetel menyang 20 ms, pesen meh tansah ditampilake. Nalika wektu turu cendhak, benang mung ora duwe wektu kanggo miwiti lan nindakake pakaryane. Nanging, bakal langsung mandheg. Cara liya yaiku nggunakake cara diselani () ing obyek Utas . Iki ngasilake nilai gendera internal sing diselani, sing minangka standar palsu . Utawa cara interrupt () sawijining , sing nyetel gendéra iki bener (nalika gendéra bener , thread kudu mandheg mlaku). Ayo katon ing conto:
public class CustomThread extends Thread {

   @Override
   public void run() {
       {
           while (!Thread.interrupted()) {
               System.out.println("The thread is executing some logic...");
           }
           System.out.println("The thread stopped!");
       }
   }
}
Mlaku ing utama :
System.out.println("Program starting...");
Thread thread = new CustomThread();
thread.start();
Thread.sleep(3);
thread.interrupt();
System.out.println("Program stopping...");
Asil saka mlaku iki sing padha ing kasus pisanan, nanging aku pendekatan iki luwih apik: kita nulis kode kurang lan digunakake luwih siap-digawe, fungsi standar. Nah, dina iki!
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION