JavaRush /Блоги Java /Random-TG /Таҳлили саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари ...

Таҳлили саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java. Қисми 12

Дар гурӯҳ нашр шудааст
Салом! Дониш қудрат аст. Чӣ қадаре ки шумо пеш аз мусоҳибаи аввалини худ дониши бештар дошта бошед, ҳамон қадар эътимоди худро дар он эҳсос хоҳед кард. Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 12-1Бо дониши хуби шумо, шуморо ба иштибоҳ андохтан душвор хоҳад буд ва дар айни замон шумо метавонед мусоҳибаатонро ба ҳайрат оваред. Аз ин рӯ, имрӯз, бидуни таҷдиди бештар, мо таҳкими заминаи назариявии шуморо тавассути баррасии 250+ саволҳо барои таҳиягари Java идома медиҳем . Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 12-2

103. Коидахои тафтиши истиснохо дар мерос чист?

Агар ман саволро дуруст фаҳмам, онҳо дар бораи қоидаҳои кор бо истисноҳо ҳангоми мерос мепурсанд ва онҳо чунинанд:
  • Усули бекоршуда ё амалӣшуда дар насл/амалӣ наметавонад истисноҳои тафтишшударо, ки дар иерархия нисбат ба истисноҳои усули суперсинф/интерфейс баландтаранд, партояд.
Яъне, агар мо интерфейси муайяни Animal бо усуле дошта бошем, ки IOException -ро мепартояд :
public  interface Animal {
   void voice() throws IOException;
}
Ҳангоми татбиқи ин интерфейс, мо наметавонем як истиснои бештари партофташударо партояд (масалан, Exception , Throwable ), аммо мо метавонем онро бо истиснои насли иваз кунем, ба монанди FileNotFoundException :
public class Cat implements Animal {
   @Override
   public void voice() throws FileNotFoundException {
// некоторая реализация
   }
}
  • Созандаи зерсинф бояд ба блоки партовҳои худ ҳамаи синфҳои истисноии аз ҷониби конструктори суперсинф партофташуда, ки ҳангоми сохтани an object даъват карда мешавад, дохил кунад.
Фарз мекунем, ки конструктори синфи Animal бисёр истисноҳоро мегузорад:
public class Animal {
  public Animal() throws ArithmeticException, NullPointerException, IOException {
  }
Пас вориси синф низ бояд онҳоро дар созанда нишон диҳад:
public class Cat extends Animal {
   public Cat() throws ArithmeticException, NullPointerException, IOException {
       super();
   }
Ё мисли усулҳо, шумо метавонед истисноҳои якхеларо не, балки умумӣтарро муайян кунед. Дар ҳолати мо, барои муайян кардани як истиснои умумӣ кофӣ хоҳад буд - Истисно , зеро ин аҷдоди умумии ҳар се истиснои баррасишуда мебошад:
public class Cat extends Animal {
   public Cat() throws Exception {
       super();
   }

104. Оё шумо метавонед codeеро нависед, ки вақте блоки finally иҷро намешавад?

Аввалан, биёед дар хотир дорем, ки ниҳоят чӣ аст . Пештар, мо механизми гирифтани истисноҳоро дида баромадем: блоки кӯшиш майдони сайдро нишон медиҳад, дар ҳоле ки блок (ҳо) codeест, ки ҳангоми партофтани истиснои мушаххас кор хоҳад кард. Ниҳоят блоки сеюми code аст, ки пас аз ниҳоят он бо сайд иваз карда мешавад , аммо аз ҳамдигар истисно нест. Моҳияти ин блок дар он аст, ки code дар он ҳамеша новобаста аз натиҷаи кӯшиш ё сайд кор мекунад (новобаста аз он ки истисно партофта шудааст ё не). Ҳодисаҳои нокомии он хеле каманд ва онҳо ғайримуқаррарӣ мебошанд. Ҳолати соддатарини нокомӣ он аст, ки усули System.exit(0) дар codeи боло даъват мешавад , ки барномаро қатъ мекунад (онро хомӯш мекунад):
try {
   throw new IOException();
} catch (IOException e) {
   System.exit(0);
} finally {
   System.out.println("Данное сообщение не будет выведенно в консоль");
}
Баъзе ҳолатҳои дигаре низ ҳастанд, ки дар ниҳоят кор намекунанд:
  • Қатъи ғайримуқаррарии барнома, ки дар натиҷаи мушкилоти ҷиддии система ба вуҷуд омадааст, ё афтиши баъзе Хатогие, ки барномаро "вайрон мекунад" (мисоли хато метавонад ҳамон StackOwerflowError бошад , ки ҳангоми пур шудани хотираи стек ба амал меояд).
  • Вақте ки риштаи демон аз ry мегузарад ... ниҳоят блок мекунад ва дар баробари ин барнома ба итмом мерасад. Охир, риштаи демон ришта барои амалҳои пасзамина аст, яъне он авлавият ва ҳатмӣ нест ва барнома мунтазири анҷоми кори худ нахоҳад шуд.
  • Давраи маъмултарини беохир дар try or catch , ки дар он ҷараён то абад дар он ҷо боқӣ мемонад:

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

Ин савол дар мусоҳибаҳо барои навоварон хеле маъмул аст, аз ин рӯ якчанд ин ҳолатҳои истисноиро дар хотир доранд. Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 12 — 3

105. Мисоли коркарди якчанд истисноҳо дар як блоки сайдро нависед

1) Шояд савол нодуруст дода шуда бошад. То ҷое ки ман мефаҳмам, ин савол ба якчанд сайд барои як блоки кӯшиш дахл дорад :
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);
}
Агар дар блоки озмоишӣ истисно рух диҳад , пас блокҳои сайд бо навбат кӯшиш мекунанд, ки онро аз боло ба поён гиранд . қодиранд кӯшиш кунанд, ки онро сайд кунанд ва ба таври худ коркард кунанд. Аз ин рӯ, истисноҳои тангтар дар занҷири блоки сайд болотар ҷойгир карда мешаванд ва истисноҳои васеътар поёнтар ҷойгир карда мешаванд. Масалан, агар дар блоки аввалини мо як истиснои синфи Exception дастгир карда шавад , пас истисноҳои тафтишшуда ба блокҳои боқимонда ворид шуда наметавонанд (блокҳои боқимонда бо насли Истисно комилан бефоида хоҳанд буд). 2) Савол дуруст дода шуд Дар ин ҳолат коркарди мо чунин хоҳад буд:
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
   }
Истисноро тавассути catch дарёфт карда, мо кӯшиш мекунем, ки навъи мушаххаси онро тавассути усули instanceof фаҳмем , ки он барои тафтиш кардани он ки оё an object ба як намуди муайян тааллуқ дорад, истифода мешавад, то баъдтар мо онро бидуни оқибатҳои манфӣ ба ин намуд маҳдуд кунем. Ҳарду равиши баррасишавандаро дар як вазъият истифода бурдан мумкин аст, аммо ман гуфтам, ки савол нодуруст аст, зеро ман варианти дуюмро хуб намегӯям ва ҳеҷ гоҳ онро дар амалияи худ надидаам, дар ҳоле ки усули аввал бо multicatches васеъ паҳн шудааст. таваҷҷуҳ. Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 12 — 4

106. Кадом оператор ба шумо имкон медиҳад, ки истисноро барои партофтан маҷбур кунед? Мисол нависед

Ман онро аллакай якчанд маротиба дар боло истифода бурдаам, аммо бо вуҷуди ин ман ин калимаи калидиро такрор мекунам - throw . Намунаи истифода (маҷбур кардани истисно):
throw new NullPointerException();

107. Метавонед усули асосӣ истисноро партофтан мумкин аст? Агар ин тавр бошад, он ба куҷо интиқол дода мешавад?

Пеш аз ҳама, мехоҳам қайд намоям, ки main танҳо як усули муқаррарӣ нест ва бале, онро мошини виртуалӣ барои оғоз кардани иҷрои барнома даъват мекунад, аммо ба ғайр аз ин, онро аз ҳама гуна рамзи дигар даъват кардан мумкин аст. Яъне, он инчунин ба қоидаҳои муқаррарии муайян кардани истисноҳои тафтишшуда пас аз партофтан тобеъ аст :
public static void main(String[] args) throws IOException {
Мувофиқи он, истисноҳо низ метавонанд дар он ҷой дошта бошанд. Агар main бо ягон усул даъват нашуда бошад, аммо ҳамчун нуқтаи оғози барнома оғоз шуда бошад, пас истиснои аз ҷониби он партофташуда тавассути интерсептори .UncaughtExceptionHandler коркард карда мешавад . Ин коркардкунанда як ришта аст (яъне як коркардкунанда дар ҳар як ришта). Агар лозим бошад, шумо метавонед коркардкунандаи шахсии худро эҷод кунед ва онро бо истифода аз усули setDefaultUncaughtExceptionHandler , ки дар an objectи Thread даъват шудааст, насб кунед .

Мултираи

Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 12 — 5

108. Кадом асбобњои кор бо чанд риштаро медонед?

Асбобҳои асосӣ/Асосӣ барои истифодаи Multithreading дар Java:
  • Синхронизатсия механизми бастани (банд кардани) усул/блок ҳангоми ворид шудани ришта аз дигар риштаҳо мебошад.
  • Ноустувор механизми таъмини дастрасии доимӣ ба тағирёбанда аз ҷониби риштаҳои гуногун мебошад, яъне бо мавҷудияти ин тағирдиҳанда дар тағирёбанда, ҳама амалиёти таъин ва хондан бояд атомӣ бошанд. Ба ибораи дигар, риштаҳо ин тағирёбандаро ба хотираи маҳаллии худ нусхабардорӣ намекунанд ва онро тағир медиҳанд, балки арзиши аслии онро тағир медиҳанд.
Муфассалтар дар бораи ноустувор дар ин ҷо бихонед .
  • Runnable интерфейсест, ки метавонад дар як синфи муайян амалӣ карда шавад (хусусан, усули иҷрои он):
public class CustomRunnable implements Runnable {
   @Override
   public void run() {
       // некоторая логика
   }
}
Ва an objectи ин синфро эҷод карда, шумо метавонед риштаи навро бо гузоштани ин an object дар созандаи an objectи нави Thread ва даъват кардани усули start() оғоз кунед :
Runnable runnable = new CustomRunnable();
new Thread(runnable).start();
Усули оғоз усули иҷрошудаи run() -ро дар риштаи алоҳида иҷро мекунад.
  • Thread синфест, ки аз он мерос мегирад (ҳангоми бекор кардани усули иҷро ):
public class CustomThread extends Thread {
   @Override
   public void run() {
       // некоторая логика
   }
}
Ва бо сохтани an objectи ин синф ва ба кор андохтани он бо усули start() мо ба ин васила риштаи навро оғоз мекунем:
new CustomThread().start();
  • Ҳамзамон як бастаи дорои асбобҳо барои кор дар муҳити чанд ришта мебошад.
Он аз: иборат аст:
  • Коллексияҳои ҳамзамон - маҷмӯи маҷмӯаҳо барои кор дар муҳити чанд ришта махсусгардонида шудаанд.
  • Навбатҳо - навбатҳои махсусгардонидашуда барои муҳити чанд ришта (бандкунанда ва ғайрибандӣ).
  • Синхронизаторҳо утorтҳои махсус барои кор дар муҳити чанд ришта мебошанд.
  • Иҷрокунандагон механизмҳои эҷоди ҳавзҳои ришта мебошанд.
  • Қулфҳо - механизмҳои синхронизатсияи ришта (нисбат ба механизмҳои стандартӣ чандиртар - синхронизатсия, интизор шудан, огоҳ кардан, огоҳ кардан).
  • Атомика синфҳое мебошанд, ки барои иҷрои чанд ришта оптимизатсия шудаанд; ҳар як амалиёт атомист.
Маълумоти бештарро дар бораи бастаи ҳамзамон дар ин ҷо хонед .

109. Дар бораи ҳамоҳангсозии байни риштаҳо сӯҳбат кунед. Усулҳои wait(), notify() - notifyAll() join() барои чӣ истифода мешаванд?

То ҷое ки ман саволро мефаҳмам, ҳамоҳангсозӣ байни риштаҳо дар бораи тағирдиҳандаи калид аст - synchronized . Ин тағирдиҳандаро бевосита дар назди блок ҷойгир кардан мумкин аст:
synchronized (Main.class) {
   // некоторая логика
}
Ё бевосита дар имзои метод:
public synchronized void move() {
   // некоторая логика}
Тавре ки ман қаблан гуфтам, синхронизатсия механизмест, ки ба шумо имкон медиҳад блок/усулро аз риштаҳои дигар пӯшед, вақте ки як ришта ба он аллакай ворид шудааст. Блок/усулро ҳамчун ҳуҷра фикр кунед. Баъзе ҷӯйборе, ки ба он ҷо омада, ба он дохил мешаванд ва онро қуфл мекунанд, ҷӯйҳои дигар, ба ҳуҷра омада, диданд, ки баста аст, то озод шуданаш дар назди он интизор мешаванд. Кори худро анҷом дода, риштаи аввал аз ҳуҷра берун мешавад ва калидро мебарорад. Ва бесабаб набуд, ки ман пайваста дар бораи калид сӯҳбат мекардам, зеро он воқеан вуҷуд дорад. Ин an objectи махсусест, ки ҳолати банд/озод дорад. Ин an object ба ҳар як an objectи Java замима карда мешавад, бинобар ин ҳангоми истифодаи блоки ҳамоҳангшуда мо бояд дар қавс an objectеро нишон диҳем, ки мутекси онро мо мехоҳем дарро пӯшем:
Cat cat = new Cat();
synchronized (cat) {
   // некоторая логика
}
Шумо инчунин метавонед mutex синфро истифода баред, чунон ки ман дар мисоли аввал кардам ( Main.class ). Вақте ки мо аз рӯи усул синхронизатсияро истифода мебарем , мо an objectеро, ки мо мехоҳем онро пӯшем, муайян намекунем, дуруст? Дар ин ҳолат, барои усули ғайристатикӣ, он дар мутекси ин an object , яъне an objectи ҷории ин синф баста мешавад. Статикӣ дар мутекси синфи ҷорӣ баста мешавад ( this.getClass(); ). Шумо метавонед бештар дар бораи mutex дар ин ҷо бихонед . Хуб, дар бораи ҳамоҳангшуда дар ин ҷо хонед . Wait() усулест, ки мутексро мебарорад ва риштаи ҷориро ба ҳолати интизорӣ мегузорад, гӯё ба монитори ҷорӣ замима карда шудааст (чизе мисли лангар). Аз ин рӯ, ин усулро танҳо аз блок ё усули ҳамоҳангшуда даъват кардан мумкин аст (дар акси ҳол, он чӣ бояд озод ва чиро интизор шавад). Инчунин қайд кунед, ки ин усули синфи Object аст . Аниқтараш, як не, ҳатто се:
  • Wait() - риштаи ҷориро ба ҳолати интизорӣ мегузорад, то он даме ки риштаи дигар усули notify() ё notifyAll()- ро барои ин an object даъват кунад (дар бораи ин усулҳо баъдтар сӯҳбат хоҳем кард).

  • Мунтазир бошед (таъмини тӯлонӣ) - риштаи ҷориро ба ҳолати интизорӣ мегузорад, то он даме, ки риштаи дигар усули notify() ё notifyAll()- ро дар ин an object занг занад ё мӯҳлати муқарраршуда ба охир мерасад .

  • Мунтазир бошед (таъмини тӯлонӣ, int nanos) - монанд ба пештара, танҳо нанос имкон медиҳад, ки наносонияҳоро муайян кунед (танзими дақиқтар вақт).

  • Notify() усулест, ки ба шумо имкон медиҳад, ки як риштаи тасодуфии блоки ҳамоҳангсозии ҷорӣ бедор шавед. Боз ҳам, онро танҳо дар як блок ё усули ҳамоҳангшуда даъват кардан мумкин аст (дар ниҳоят, дар дигар ҷойҳо он касе надорад, ки ях кунад).

  • NotifyAll() усулест, ки ҳамаи риштаҳои интизориро дар монитори ҷорӣ бедор мекунад (инчунин танҳо дар блок ё усули ҳамоҳангшуда истифода мешавад ).

110. Чї тавр љараёнро боздоштан мумкин аст?

Аввалин чизе, ки бояд гуфт, ин аст, ки вақте усули run() пурра иҷро мешавад , ришта ба таври худкор нест карда мешавад. Аммо баъзан ба шумо лозим аст, ки ӯро пеш аз мӯҳлат, пеш аз он ки ин усул ба анҷом расад, кушед. Пас мо бояд чӣ кор кунем? Шояд an objectи Thread бояд усули stop() дошта бошад ? Новобаста аз он ки чӣ гуна аст! Ин усул кӯҳна ҳисобида мешавад ва метавонад боиси садамаҳои система гардад. Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 12 — 6Хуб, пас чӣ? Ду роҳи ин кор вуҷуд дорад: Якум ин аст, ки парчами дохorи мантиқии худро истифода баред. Биёед як мисолро дида бароем. Мо як риштаи амалии худро дорем, ки бояд як ибораи муайянро дар экран нишон диҳад, то он даме ки он пурра қатъ шавад:
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;
   }
}
Ҳангоми истифодаи усули stopRunning() парчами дохилӣ бардурӯғ мешавад ва усули иҷро кор карданро қатъ мекунад. Биёед онро дар асосӣ иҷро кунем :
System.out.println("Начало выполнения программы");
CustomThread thread = new CustomThread();
thread.start();
Thread.sleep(3);
// пока наш основной поток спит, вспомогательный  CustomThread работает и выводит в коноль своё сообщение
thread.stopRunningThread();
System.out.println("Конец выполнения программы");
Дар натиҷа, мо дар консол чунин чизеро мебинем:
Оғози иҷрои барнома Ришта як мантиқро иҷро мекунад... Ришта як мантиқро иҷро мекунад... Ришта баъзе мантиқҳоро иҷро мекунад... Ришта баъзе мантиқҳоро иҷро мекунад... ришта ягон мантиқро иҷро мекунад... Анҷоми иҷрои барнома Ришта қатъ шуд!
Ин маънои онро дорад, ки риштаи мо кор кард, миқдори муайяни паёмҳоро ба консол баровардааст ва бомуваффақият қатъ карда шуд. Ман қайд мекунам, ки шумораи паёмҳои баромад аз як иҷро ба иҷро фарқ мекунад; баъзан риштаи иловагӣ ҳатто чизе намеовард. Тавре ки ман мушоҳида кардам, ин аз вақти хоби риштаи асосӣ вобаста аст, ҳар қадар дарозтар бошад, ҳамон қадар эҳтимолияти риштаи иловагӣ чизе набарорад. Бо вақти хоби 1ms, паёмҳо қариб ҳеҷ гоҳ бароварда намешаванд, аммо агар шумо онро ба 20ms муқаррар кунед, он қариб ҳамеша кор мекунад. Шояд, вақте ки вақт кӯтоҳ аст, ришта барои оғоз кардан ва оғоз кардани кораш вақт надорад ва фавран қатъ карда мешавад. Роҳи дуюм ин аст, ки усули interrupted() дар an objectи Thread , ки арзиши парчами қатъи дохorро бармегардонад (ин парчам бо нобаёнӣ дурӯғ аст ) ва усули дигари interrupt() , ки ин парчамро ба true муқаррар мекунад (вақте ки ин байрақ дуруст аст , ки ришта бояд кори худро қатъ кунад). Биёед як мисолро дида бароем:
public class CustomThread extends Thread {

   @Override
   public void run() {
       {
           while (!Thread.interrupted()) {
               System.out.println("Поток выполняет некую логику...");
           }
           System.out.println("Поток остановлен!");
       }
   }
}
Иҷроиши асосӣ :
System.out.println("Начало выполнения программы");
Thread thread = new CustomThread();
thread.start();
Thread.sleep(3);
thread.interrupt();
System.out.println("Конец выполнения программы");
Натиҷаи иҷро ҳамон тавре ки дар ҳолати аввал хоҳад буд, аммо ин равиш ба ман бештар маъқул аст: мо codeи камтар менависем ва функсияҳои омодаи стандартиро бештар истифода мебарем. Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 12 — 7Дар ин ҷо мо имрӯз таваққуф мекунем.Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 12 — 8
Дигар маводҳо дар силсила:
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION