JavaRush /Blog Jawa /Random-JV /Analisis pitakonan lan wangsulan saka wawancara kanggo pa...

Analisis pitakonan lan wangsulan saka wawancara kanggo pangembang Jawa. Bagean 12

Diterbitake ing grup
Hello! Kawruh iku daya. Luwih akeh kawruh sing sampeyan duwe sadurunge wawancara pisanan, luwih yakin sampeyan bakal ngrasakake. Analisis pitakonan lan wangsulan saka wawancara kanggo pangembang Jawa.  Bagean 12 - 1Kanthi jumlah kawruh sing apik, sampeyan bakal angel bingung, lan ing wektu sing padha sampeyan bakal bisa kaget karo pewawancara sampeyan. Mula, dina iki, tanpa ado maneh, kita bakal terus nguatake basis teori sampeyan kanthi mriksa luwih saka 250 pitakonan kanggo pangembang Java . Analisis pitakonan lan wangsulan saka wawancara kanggo pangembang Jawa.  Bagean 12 - 2

103. Apa aturan kanggo mriksa pengecualian ing warisan?

Yen aku ngerti pitakonan kasebut kanthi bener, dheweke takon babagan aturan kanggo nggarap pangecualian sajrone warisan, lan 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 metode superclass / antarmuka.
Yaiku, yen kita duwe antarmuka Animal tartamtu kanthi metode sing mbuwang IOException :
public  interface Animal {
   void voice() throws IOException;
}
Ing implementasine antarmuka iki, kita ora bisa mbuwang pangecualian sing dibuwang sing luwih umum (contone, Exception , Throwable ), nanging kita bisa ngganti karo pengecualian turunan, kayata FileNotFoundException :
public class Cat implements Animal {
   @Override
   public void voice() throws FileNotFoundException {
// некоторая реализация
   }
}
  • Konstruktor subclass kudu kalebu ing uncalan mblokir kabeh kelas pangecualian sing dibuwang dening konstruktor superclass sing diarani nalika nggawe obyek.
Upaminipun konstruktor kelas Animal mbuwang akeh pengecualian:
public class Animal {
  public Animal() throws ArithmeticException, NullPointerException, IOException {
  }
Banjur ahli waris kelas uga kudu nuduhake ing konstruktor:
public class Cat extends Animal {
   public Cat() throws ArithmeticException, NullPointerException, IOException {
       super();
   }
Utawa, kaya ing kasus cara, sampeyan ora bisa nemtokake pangecualian sing padha, nanging sing luwih umum. Ing kasus kita, bakal cukup kanggo nemtokake pangecualian sing luwih umum - Pangecualian , amarga iki minangka leluhur umum saka kabeh telung pangecualian sing dianggep:
public class Cat extends Animal {
   public Cat() throws Exception {
       super();
   }

104. Apa sampeyan bisa nulis kode nalika blok pungkasan ora bakal ditindakake?

Pisanan, ayo elinga apa pungkasane . Sadurunge, kita katon ing mekanisme kanggo nyekel istiméwa: blok nyoba njelaske nganggo bentuk garis wilayah keno, nalika pamblokiran nyekel (s) kode sing bakal bisa nalika istiméwa tartamtu dibuwang. Pungkasan yaiku blok kode katelu sawise pungkasane bisa diganti karo nyekel nanging ora eksklusif. Inti saka pemblokiran iki sing kode ing tansah dianggo, preduli saka asil nyoba utawa nyekel ( preduli saka pangecualian dibuwang utawa ora). Kasus gagal kasebut arang banget lan ora normal. Kasus kegagalan sing paling gampang yaiku nalika metode System.exit (0) diarani kode ing ndhuwur , sing mungkasi program kasebut (mateni):
try {
   throw new IOException();
} catch (IOException e) {
   System.exit(0);
} finally {
   System.out.println("Данное сообщение не будет выведенно в консоль");
}
Ana uga sawetara kahanan liyane sing pungkasane ora bisa digunakake:
  • mandap ora normal saka program disebabake masalah sistem kritis, utawa tiba saka sawetara Error sing bakal "crash" aplikasi (conto kesalahan bisa padha StackOwerflowError sing occurs nalika memori tumpukan overflows).
  • Nalika thread deamon liwat ry ... pungkasanipun mblokir lan ing podo karo karo program ends. Sawise kabeh, benang deamon minangka utas kanggo tumindak latar mburi, yaiku, ora dadi prioritas lan wajib, lan aplikasi ora bakal ngenteni karyane rampung.
  • Daur ulang tanpa wates sing paling umum, ing nyoba utawa nyekel , yen alirane bakal tetep ana ing salawas-lawase:

    try {
       while (true) {
       }
    } finally {
       System.out.println("Данное сообщение не будет выведенно в консоль");
    }

Pitakonan iki cukup populer ing wawancara kanggo pemula, mula sawetara kahanan sing luar biasa iki kudu dieling-eling. Analisis pitakonan lan wangsulan saka wawancara kanggo pangembang Jawa.  Bagean 12 - 3

105. Tulis conto nangani sawetara pengecualian ing siji blok nyekel

1) Mbok menawa pitakonan kasebut salah. Nalika aku ngerti, pitakonan iki nuduhake pirang-pirang tangkapan kanggo siji blok coba :
try {
  throw new FileNotFoundException();
} catch (FileNotFoundException e) {
   System.out.print("Упс, у вас упало исключение - " + e);
} catch (IOException e) {
   System.out.print("Упс, у вас упало исключение - " + e);
} catch (Exception e) {
   System.out.print("Упс, у вас упало исключение - " + e);
}
Yen ana pangecualian ing pamblokiran nyoba , banjur pamblokiran tangkapan kanthi gantian nyoba nyekel saka ndhuwur tekan ngisor. bisa nyoba nyekel lan ngolah kanthi cara dhewe. Mulane, pangecualian sempit diselehake luwih dhuwur ing chain pemblokiran nyekel , lan pangecualian jembare diselehake ngisor. Contone, yen ing pamblokiran tangkapan pisanan , pangecualian saka kelas Pengecualian kejiret , banjur pangecualian sing dicenthang ora bakal bisa mlebu ing blok sing isih ana (blok sing isih ana karo keturunan Pengecualian bakal ora ana gunane). 2) Pitakonan ditakoni kanthi bener, ing kasus iki, pangolahan bakal katon kaya ing ngisor iki:
try {
  throw new NullPointerException();
} catch (Exception e) {
   if (e instanceof FileNotFoundException) {
       // некоторая обработка с сужением типа (FileNotFoundException)e
   } else if (e instanceof ArithmeticException) {
       // некоторая обработка с сужением типа (ArithmeticException)e
   } else if(e instanceof NullPointerException) {
       // некоторая обработка с сужением типа (NullPointerException)e
   }
Duwe kejiret pangecualian liwat nyekel , kita nyoba kanggo mangerteni jinis tartamtu liwat instanceof cara , kang digunakake kanggo mriksa apa obyek belongs kanggo jinis tartamtu, supaya mengko kita bisa mbatesi jinis iki tanpa jalaran negatif. Loro-lorone pendekatan sing dianggep bisa digunakake ing kahanan sing padha, nanging aku ujar manawa pitakonan kasebut ora bener amarga aku ora bakal nyebat pilihan kaloro sing apik lan durung nate ndeleng ing praktikku, nanging ing wektu sing padha, metode pertama kanthi multicatches wis nyebar. perhatian. nyebar. Analisis pitakonan lan wangsulan saka wawancara kanggo pangembang Jawa.  Bagean 12 - 4

106. Operator sing ngidini sampeyan meksa pengecualian supaya dibuwang? Tulis tuladha

Aku wis digunakake kaping pirang-pirang ing ndhuwur, nanging aku bakal mbaleni tembung kunci iki - throw . Conto panggunaan (meksa pangecualian):
throw new NullPointerException();

107. Bisa cara utama uncalan mbalang istiméwa? Yen mangkono, ngendi bakal ditransfer?

Kaping pisanan, aku pengin Wigati sing utama ora luwih saka cara biasa, lan ya, iku disebut dening mesin virtual kanggo miwiti nglakokaké program, nanging liyane iki, iku bisa disebut saka kode liyane. Yaiku, uga tundhuk karo aturan biasa kanggo nemtokake pangecualian sing dicenthang sawise mbuwang :
public static void main(String[] args) throws IOException {
Mulane, pangecualian uga bisa kedadeyan ing kono. Yen utama ora diarani ing sawetara cara, nanging diwiwiti minangka titik peluncuran program, pangecualian sing dibuwang bakal ditangani dening interceptor .UncaughtExceptionHandler . Handler iki siji saben thread (yaiku, siji handler ing saben thread). Yen perlu, sampeyan bisa nggawe handler dhewe lan nyetel nggunakake metode setDefaultUncaughtExceptionHandler disebut ing obyek Utas .

Multithreading

Analisis pitakonan lan wangsulan saka wawancara kanggo pangembang Jawa.  Bagean 12 - 5

108. Apa alat sing sampeyan ngerti kanggo nggarap multithreading?

Piranti Dasar/Dasar kanggo Nggunakake Multithreading ing Jawa:
  • Sinkronisasi minangka mekanisme kanggo nutup (blocking) cara / pamblokiran nalika thread mlebu, saka thread liyane.
  • Volatile minangka mekanisme kanggo njamin akses konsisten menyang variabel kanthi benang sing beda-beda, yaiku, kanthi anané modifier iki ing variabel, kabeh tugas lan operasi maca kudu atom. Ing tembung liya, benang ora bakal nyalin variabel iki menyang memori lokal lan ngganti, nanging bakal ngganti nilai asline.
Waca liyane babagan volatile kene .
  • Runnable minangka antarmuka sing bisa dileksanakake (utamane, metode run) ing kelas tartamtu:
public class CustomRunnable implements Runnable {
   @Override
   public void run() {
       // некоторая логика
   }
}
Lan wis nggawe obyek saka kelas iki, sampeyan bisa miwiti thread anyar kanthi nyetel obyek iki ing konstruktor obyek Utas anyar lan nelpon cara wiwitan () :
Runnable runnable = new CustomRunnable();
new Thread(runnable).start();
Cara wiwitan mbukak cara dileksanakake roto () ing thread kapisah.
  • Utas minangka kelas, sing diwarisake (nalika ngatasi metode run ):
public class CustomThread extends Thread {
   @Override
   public void run() {
       // некоторая логика
   }
}
Lan kanthi nggawe obyek saka kelas iki lan diluncurake nggunakake metode wiwitan () , mula kita bakal ngluncurake utas anyar:
new CustomThread().start();
  • Concurrency minangka paket kanthi alat kanggo nggarap lingkungan multi-threaded.
Iku kasusun saka:
  • Concurrent Collections - kumpulan koleksi khusus kanggo nggarap lingkungan multi-threaded.
  • Antrian - antrian khusus kanggo lingkungan multi-threaded (blocking lan non-blocking).
  • Sinkronisasi minangka utilitas khusus kanggo makarya ing lingkungan multi-threaded.
  • Executors minangka mekanisme kanggo nggawe pools thread.
  • Kunci - mekanisme sinkronisasi benang (luwih fleksibel tinimbang standar - disinkronake, ngenteni, notifikasi, notifyAll).
  • Atomics minangka kelas sing dioptimalake kanggo eksekusi multi-threaded; saben operasi yaiku atom.
Waca liyane babagan paket bebarengan kene .

109. Dhiskusi babagan sinkronisasi antarane benang. Apa Enteni (), notify () - notifyAll () gabung () cara digunakake kanggo?

Sa adoh aku ngerti pitakonan, sinkronisasi antarane Utas bab modifikasi tombol - synchronized . Modifier iki bisa diselehake langsung ing jejere blok:
synchronized (Main.class) {
   // некоторая логика
}
Utawa langsung ing tandha cara:
public synchronized void move() {
   // некоторая логика}
Kaya sing dakkandhakake sadurunge, sinkronisasi minangka mekanisme sing ngidini sampeyan nutup blok / metode saka benang liyane nalika siji benang wis mlebu. Coba blok / metode minangka kamar. Sawetara aliran, sing wis teka, bakal mlebu lan ngunci, aliran liyane, sing teka ing kamar lan weruh yen ditutup, bakal ngenteni nganti bebas. Sawise nindakake bisnis, benang pisanan ninggalake kamar lan ngeculake kunci. Lan ora kanggo apa-apa aku terus-terusan ngomong babagan kunci, amarga pancen ana. Iki minangka obyek khusus sing nduweni status sibuk / bebas. Obyek iki ditempelake ing saben obyek Jawa, dadi nalika nggunakake blok sing disinkronake, kita kudu nuduhake ing kurung obyek sing mutex arep ditutup lawang:
Cat cat = new Cat();
synchronized (cat) {
   // некоторая логика
}
Sampeyan uga bisa nggunakake mutex kelas, kaya aku ing conto pisanan ( Main.class ). Nalika nggunakake cara sing disinkronake , kita ora nemtokake obyek sing arep ditutup, ta? Ing kasus iki, kanggo cara non-statis, iku bakal nutup ing mutex saka obyek iki , sing, obyek saiki kelas iki. Sing statis bakal nutup ing mutex saka kelas saiki ( this.getClass (); ). Sampeyan bisa maca liyane babagan mutex kene . Inggih, maca babagan diselarasake kene . Enteni () iku cara sing nerbitaké mutex lan nempatno thread saiki menyang mode siyaga, kaya ditempelake ing monitor saiki (kaya anchor). Amarga iki, cara iki mung bisa diarani saka blok utawa cara sing disinkronake (yen ora, apa sing kudu gratis lan apa sing dikarepake). Uga elinga yen iki minangka metode kelas Obyek . Luwih tepate, ora siji, nanging malah telu:
  • Enteni () - nempatno thread saiki menyang mode Enteni nganti thread liyane nelpon notify () utawa notifyAll () cara kanggo obyek iki (kita bakal pirembagan bab cara iki mengko).

  • Enteni (wektu entek dawa) - nempatno thread saiki menyang mode ngenteni nganti thread liyane nelpon notify () utawa notifyAll () cara ing obyek iki utawa wektu entek kasebut kadaluwarsa .

  • Enteni (wektu entek dawa, int nanos) - padha karo sing sadurunge, mung nano sing ngidini sampeyan nemtokake nanodetik (setelan wektu sing luwih tepat).

  • Notify () iku cara sing ngijini sampeyan kanggo tangi siji Utas acak saka pamblokiran sinkronisasi saiki. Maneh, mung bisa diarani ing blok utawa cara sing disinkronake (sawise kabeh, ing papan liya ora ana sing bisa dibebasake).

  • NotifyAll () iku cara sing wakes munggah kabeh Utas nunggu ing monitor saiki (uga digunakake mung ing pemblokiran diselarasake utawa cara).

110. Kepiye carane nyetop aliran?

Wangsulan: Bab ingkang sapisanan ngandika iku nalika roto () cara wis kebak kaleksanan , Utas otomatis numpes. Nanging kadhangkala sampeyan kudu mateni dheweke sadurunge jadwal, sadurunge cara iki rampung. Banjur apa sing kudu kita lakoni? Mbok obyek Utas kudu mandeg () cara ? Ora ketompo carane iku! Cara iki dianggep ketinggalan jaman lan bisa nyebabake kacilakan sistem. Analisis pitakonan lan wangsulan saka wawancara kanggo pangembang Jawa.  Bagean 12 - 6Nah, banjur apa? Ana rong cara kanggo nindakake iki: Kapisan nggunakake gendera boolean internal. Ayo padha ndeleng conto. Kita duwe implementasine thread dhewe sing kudu nampilake frasa tartamtu ing layar nganti mandheg rampung:
public class CustomThread extends Thread {
private boolean isActive;

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

   @Override
   public void run() {
       {
           while (isActive) {
               System.out.println("Поток выполняет некую логику...");
           }
           System.out.println("Поток остановлен!");
       }
   }

   public void stopRunningThread() {
       isActive = false;
   }
}
Nalika nggunakake cara stopRunning () , flag internal dadi palsu lan cara roto mandheg mlaku. Ayo mbukak ing utama :
System.out.println("Начало выполнения программы");
CustomThread thread = new CustomThread();
thread.start();
Thread.sleep(3);
// пока наш основной поток спит, вспомогательный  CustomThread работает и выводит в коноль своё сообщение
thread.stopRunningThread();
System.out.println("Конец выполнения программы");
Akibaté, kita bakal weruh kaya iki ing konsol:
Miwiti eksekusi program Utas nglakokaké sawetara logika... Utas nglakokaké sawetara logika... Utas nglakokaké sawetara logika... Utas nglakokaké sawetara logika... Utas nglakokaké sawetara logika... Utas nglakokake sawetara logika... Pungkasan eksekusi program Utas mandheg !
Iki tegese thread kita makarya, output nomer tartamtu pesen menyang console lan kasil mandegake. Aku nyathet yen jumlah pesen sing dikirim bakal beda-beda saka run to run; kadhangkala benang tambahan ora ngasilake apa-apa. Nalika aku ngeweruhi, iki gumantung ing wektu turu thread utama, maneh iku, kurang kasempatan thread tambahan ora output apa-apa. Kanthi wektu turu 1ms, pesen meh ora tau metu, nanging yen sampeyan nyetel menyang 20ms, meh tansah bisa. Mbok menawa wektu cendhak, benang mung ora duwe wektu kanggo miwiti lan miwiti karya, lan langsung mandheg. Cara liya yaiku nggunakake metode interrupted () ing obyek Utas , sing ngasilake nilai gendera interrupt internal (gendéra iki palsu kanthi standar ) lan metode interrupt () liyane , sing nyetel gendéra iki dadi bener (nalika iki gendéra bener thread kudu mungkasi karya). Ayo katon ing conto:
public class CustomThread extends Thread {

   @Override
   public void run() {
       {
           while (!Thread.interrupted()) {
               System.out.println("Поток выполняет некую логику...");
           }
           System.out.println("Поток остановлен!");
       }
   }
}
Run ing utama :
System.out.println("Начало выполнения программы");
Thread thread = new CustomThread();
thread.start();
Thread.sleep(3);
thread.interrupt();
System.out.println("Конец выполнения программы");
Asil eksekusi bakal padha karo kasus sing sepisanan, nanging aku luwih seneng pendekatan iki: kita nulis kode sing kurang lan nggunakake fungsi standar sing luwih siap. Analisis pitakonan lan wangsulan saka wawancara kanggo pangembang Jawa.  Bagean 12 - 7Ing kana kita bakal mandheg dina iki.Analisis pitakonan lan wangsulan saka wawancara kanggo pangembang Jawa.  Bagean 12 - 8
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION