Багатопотоковість і синхронізація вважаються типовою главою програмування на Java. У компаніях, які займаються розробкою ігор, найчастіше задають питання на інтерв’ю, пов’язані з багатопотоковістю. Нижче наведено список поширених запитань на співбесіді щодо багатопоточності та паралелізму Java.
Багатопотокові питання інтерв'ю
1) Що таке багатопотоковість?
Багатопотоковість — це процес виконання кількох потоків одночасно. Багатопотоковість використовується для досягнення багатозадачності. Він споживає менше пам'яті та забезпечує швидку та ефективну роботу. Його основні переваги:
- Потоки спільно використовують той самий адресний простір.
- Нитка легка.
- Вартість комунікації між процесами низька.
2) Що таке нитка?
Потік — це легкий підпроцес. Це окремий шлях виконання, оскільки кожен потік працює в іншому фреймі стека. Процес може містити кілька потоків. Потоки спільно використовують ресурси процесу, але все ж виконуються незалежно.
Детальніше.3) Розрізняйте процес і потік?
Існують такі відмінності між процесом і потоком.
- Програма у виконанні називається процесом, тоді як; Потік є підмножиною процесу
- Процеси незалежні, тоді як потоки є підмножиною процесу.
- Процеси мають різний адресний простір у пам’яті, тоді як потоки містять спільний адресний простір.
- Перемикання контексту між потоками відбувається швидше, ніж процеси.
- Зв'язок між процесами є повільнішим і дорогим, ніж зв'язок між потоками.
- Будь-які зміни в батьківському процесі не впливають на дочірній процес, тоді як зміни в батьківському потоці можуть вплинути на дочірній потік.
4) Що ви розумієте під міжпотоковим зв’язком?
- Процес зв'язку між синхронізованими потоками називається зв'язком між потоками.
- Міжпотоковий зв'язок використовується, щоб уникнути опитування потоку в Java.
- Виконання потоку в його критичній секції призупиняється, а іншому потоку дозволяється увійти (або заблокувати) у цю ж критичну секцію для виконання.
- Його можна отримати методами wait(), notify() і notifyAll().
5) Яке призначення методу wait() у Java?
Метод wait() надається класом Object у Java. Цей метод використовується для міжпотокового зв’язку в Java. java.lang.Object.wait() використовується для призупинення поточного потоку та очікування, доки інший потік не викличе метод notify() або notifyAll(). Його синтаксис наведено нижче.
public final void wait()
6) Чому метод wait() потрібно викликати із синхронізованого блоку?
Ми повинні викликати метод очікування, інакше він викине java.lang.IllegalMonitorStateException виняток. Крім того, нам потрібен метод wait() для міжпотокового зв’язку з notify() і notifyAll(). Тому він повинен бути присутнім у синхронізованому блоці для належного та коректного зв’язку.
7) Які переваги багатопоточності?
Багатопотокове програмування має такі переваги:
- Багатопотоковість дозволяє додатку/програмі завжди реагувати на вхідні дані, навіть уже запущені з деякими фоновими завданнями
- Багатопотоковість дозволяє швидше виконувати завдання, оскільки потоки виконуються незалежно.
- Багатопотоковість забезпечує краще використання кеш-пам'яті, оскільки потоки спільно використовують загальні ресурси пам'яті.
- Багатопотоковість зменшує кількість необхідних серверів, оскільки один сервер може виконувати кілька потоків одночасно.
8) Які стани життєвого циклу потоку?
Потік може мати один із таких станів протягом свого життя:
9) Яка різниця між випереджаючим плануванням і розрізом часу?
За випереджувального планування завдання з найвищим пріоритетом виконується, поки воно не перейде в стан очікування або мертвого стану або не з’явиться завдання з вищим пріоритетом. У разі розподілу часу завдання виконується протягом попередньо визначеного проміжку часу, а потім знову потрапляє до пулу готових завдань. Потім планувальник визначає, яке завдання слід виконати наступним, на основі пріоритету та інших факторів.
10) Що таке перемикання контексту?
У режимі перемикання контексту стан процесу (або потоку) зберігається, щоб його можна було відновити, а виконання можна було відновити з тієї ж точки пізніше. Перемикання контексту дозволяє декільком процесам використовувати один і той самий процесор.
11) Розрізняйте клас Thread та інтерфейс Runnable для створення потоку?
Потік можна створити двома способами.
- Розширюючи клас Thread
- Шляхом реалізації інтерфейсу Runnable
Однак основні відмінності між обома способами наведені нижче:
- Розширюючи клас Thread, ми не можемо розширити будь-який інший клас, оскільки Java не дозволяє багаторазове успадкування під час реалізації інтерфейсу Runnable; ми також можемо розширити інший базовий клас (за потреби).
- Розширюючи клас Thread, кожен з потоків створює унікальний об’єкт і асоціюється з ним під час реалізації інтерфейсу Runnable; кілька потоків спільно використовують один і той же об'єкт
- Клас Thread надає різні вбудовані методи, такі як getPriority(), isAlive та багато інших, тоді як інтерфейс Runnable надає єдиний метод, тобто run().
12) Що означає метод join()?
Метод join() очікує завершення потоку. Іншими словами, це призводить до припинення виконання поточних потоків, доки потік, до якого він приєднується, не завершить своє завдання. Метод Join перевантажується в класі Thread наступним чином.
- public void join() викликає InterruptedException
- public void join (довгі мілісекунди) викликає InterruptedException
13) Опишіть призначення та роботу методу sleep().
Метод sleep() у Java використовується для блокування потоку на певний час, що означає призупинення виконання потоку на певний час. Є два способи зробити це.
Синтаксис:
вік салмана хана
- public static void sleep (довгі мілісекунди) викликає InterruptedException
- public static void sleep(long milliseconds, int nanos) генерує InterruptedException
Робота методу sleep().
програма java hello
Коли ми викликаємо метод sleep(), він призупиняє виконання поточного потоку на заданий час і надає пріоритет іншому потоку (якщо доступний). Більше того, коли час очікування завершується, попередній потік знову змінює свій стан із очікування на виконуваний і переходить у стан виконання, і весь процес працює так, доки виконання не завершиться.
14) Яка різниця між методами wait() і sleep()?
чекай() | спати() |
---|---|
1) Метод wait() визначено в класі Object. | Метод sleep() визначено в класі Thread. |
2) Метод wait() знімає блокування. | Метод sleep() не знімає блокування. |
15) Чи можна розпочати потік двічі?
Ні, ми не можемо перезапустити потік, оскільки після запуску та виконання потоку він переходить у стан Dead. Таким чином, якщо ми спробуємо запустити потік двічі, це видасть виключення runtimeException 'java.lang.IllegalThreadStateException'. Розглянемо наступний приклад.
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(); } }
Вихід
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)Детальніше.
16) Чи можемо ми викликати метод run() замість start()?
Так, прямий виклик методу run() дійсний, але він не працюватиме як потік, натомість працюватиме як звичайний об’єкт. Не буде перемикання контексту між потоками. Коли ми викликаємо метод start(), він внутрішньо викликає метод run(), який створює новий стек для потоку, тоді як прямий виклик run() не створить новий стек.
Детальніше.17) А як щодо потоків демона?
Потоки демона — це потоки з низьким пріоритетом, які забезпечують фонову підтримку та послуги для потоків користувачів. Потік демона автоматично припиняється JVM, якщо програма залишається лише з потоком демона, а всі інші потоки користувача завершуються/припиняються. У класі Thread є два методи потоку демона:
18) Чи можемо ми зробити потік користувача потоком демона, якщо потік запущено?
Ні, якщо ви це зробите, буде викинуто IllegalThreadStateException. Тому ми можемо лише створити потік демона перед запуском потоку.
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. } }
Вихід
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)Детальніше.
19) Що таке гачок вимкнення?
Гачок вимкнення — це потік, який неявно викликається перед завершенням роботи JVM. Таким чином, ми можемо використовувати його, щоб виконати очищення ресурсу або зберегти стан, коли JVM нормально або раптово вимикається. Ми можемо додати гачок відключення за допомогою наступного методу:
public�void�addShutdownHook(Thread�hook){}�� Runtime r=Runtime.getRuntime(); r.addShutdownHook(new MyThread());
Нижче наведено кілька важливих моментів щодо гаків вимкнення:
- Перехоплювачі вимкнення ініціалізовано, але їх можна запустити лише після завершення роботи JVM.
- Перехоплювачі відключення є більш надійними, ніж finalizer(), тому що існує набагато менше шансів, що перехоплювачі відключення не запускаються.
- Перехоплення відключення можна зупинити, викликавши метод halt(int) класу Runtime.
20) Коли нам слід переривати потік?
Ми повинні переривати потік, коли хочемо вийти зі стану сну або очікування потоку. Ми можемо перервати потік, викликавши interrupt()�, викликавши InterruptedException.
Детальніше.21) Що таке синхронізація?
Синхронізація — це можливість контролювати доступ кількох потоків до будь-якого спільного ресурсу. Застосовується:
- Щоб запобігти втручанню ниток.
- Щоб запобігти проблемі узгодженості.
Коли кілька потоків намагаються виконати одне й те саме завдання, існує ймовірність помилкового результату, отже, щоб усунути цю проблему, Java використовує процес синхронізації, який дозволяє виконувати лише один потік одночасно. Синхронізації можна досягти трьома способами:
- синхронізованим методом
- синхронізованим блоком
- шляхом статичної синхронізації
Синтаксис для синхронізованого блоку
synchronized(object reference expression) { //code block }Детальніше.
22) Яке призначення блоку Synchronized?
Блок Synchronized можна використовувати для виконання синхронізації будь-якого конкретного ресурсу методу. Лише один потік за раз може виконуватися на певному ресурсі, а всі інші потоки, які намагаються увійти до синхронізованого блоку, блокуються.
- Синхронізований блок використовується для блокування об’єкта для будь-якого спільного ресурсу.
- Область дії синхронізованого блоку обмежена блоком, до якого він застосований. Його обсяг менший, ніж метод.
23) Чи можна заблокувати об’єкт Java для виключного використання певним потоком?
Так. Ви можете заблокувати об’єкт, помістивши його в «синхронізований» блок. Заблокований об’єкт недоступний для жодного потоку, окрім того, який явно забрав його.
24) Що таке статична синхронізація?
Якщо ви зробите будь-який статичний метод синхронізованим, блокування буде на класі, а не на об’єкті. Якщо ми використовуємо ключове слово synchronized перед методом, це заблокує об’єкт (один потік може отримати доступ до об’єкта за раз), але якщо ми використаємо static synchronized, це заблокує клас (один потік може отримати доступ до класу за раз). Детальніше.
25) Яка різниця між notify() і notifyAll()?
Notify() використовується для розблокування одного потоку, що очікує, тоді як метод notifyAll() використовується для розблокування всіх потоків у стані очікування.
26) Що таке безвихідь?
Взаємоблокування — це ситуація, коли кожен потік очікує на ресурс, який утримується іншим потоком, що очікує. У цій ситуації жоден з потоків не виконується і не отримує шансу на виконання. Замість цього існує універсальний стан очікування серед усіх потоків. Взаємоблокування — це дуже складна ситуація, яка може зламати наш код під час виконання.
Детальніше.27) Як виявити стан взаємоблокування? Як цього уникнути?
Ми можемо виявити взаємоблокування, запустивши код на cmd і зібравши дамп потоку, і якщо в коді присутній будь-який взаємоблок, на cmd з’явиться повідомлення.
Способи уникнення стану блокування в Java:
28) Що таке планувальник потоків у java?
У Java, коли ми створюємо потоки, вони контролюються за допомогою Thread Scheduler, який є частиною JVM. Планувальник потоків відповідає лише за рішення, який потік слід виконати. Планувальник потоків використовує два механізми для планування потоків: випереджувальний і часовий розріз.
Планувальник потоків Java також працює для прийняття наступних рішень для потоку:- Він вибирає пріоритет потоку.
- Він визначає час очікування для потоку
- Він перевіряє природу потоку
29) Чи кожен потік має свій стек у багатопоточному програмуванні?
Так, у багатопоточному програмуванні кожен потік підтримує власну або окрему область стека в пам’яті, завдяки чому кожен потік незалежний один від одного.
30) Як досягається безпека потоку?
Якщо метод або об’єкт класу може використовуватися декількома потоками одночасно без будь-яких умов змагання, тоді клас є потокобезпечним. Безпека потоків використовується, щоб зробити програму безпечною для використання в багатопоточному програмуванні. Його можна досягти такими способами:
ymail
- Синхронізація
- Використання ключового слова Volatile
- Використання механізму на основі замка
- Використання класів атомарної оболонки
31) Що таке умови перегонів?
Умова гонки — це проблема, яка виникає в багатопоточному програмуванні, коли одночасно виконуються різні потоки, які одночасно отримують доступ до спільного ресурсу. Правильне використання синхронізації може уникнути стану Race.
32) Яке ключове слово volatile у java?
Ключове слово volatile використовується в багатопоточному програмуванні для забезпечення безпеки потоку, оскільки зміна однієї змінної volatile є видимою для всіх інших потоків, тому одна змінна може використовуватися одним потоком одночасно.
33) Що ви розумієте під пулом потоків?
- Пул потоків Java представляє групу робочих потоків, які очікують на виділення завдання.
- Потоки в пулі потоків контролюються постачальником послуг, який витягує один потік із пулу та призначає йому завдання.
- Після виконання заданого завдання поток знову потрапив до пулу потоків.
- Розмір пулу потоків залежить від загальної кількості потоків, збережених у резерві для виконання.
Перевагами пулу потоків є:
- Використовуючи пул потоків, можна підвищити продуктивність.
- Використовуючи пул потоків, можна отримати кращу стабільність системи.
Запитання для паралельної співбесіди
34) Які основні компоненти паралельного API?
Concurrency API можна розробити за допомогою класу та інтерфейсів пакета java.util.Concurrent. У пакеті java.util.Concurrent є такі класи та інтерфейси.
- Виконавець
- FarkJoinPool
- ВиконавецьСервіс
- ScheduledExecutorService
- майбутнє
- TimeUnit(Enum)
- CountDownLatch
- Циклічний бар'єр
- Семафор
- ThreadFactory
- Черга блокування
- DelayQueue
- Замки
- Фазер
35) Що таке інтерфейс Executor в Concurrency API в Java?
Інтерфейс виконавця, наданий пакетом java.util.concurrent, є простим інтерфейсом, який використовується для виконання нового завдання. Метод execute() інтерфейсу Executor використовується для виконання заданої команди. Синтаксис методу execute() наведено нижче.
void execute (виконувана команда)
Розглянемо такий приклад:
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(); } } } }
Вихід
Running Thread! Thread Completed
36) Що таке BlockingQueue?
Java.util.concurrent.BlockingQueue — це підінтерфейс черги, який підтримує такі операції, як очікування наявності місця перед вставленням нового значення або очікування, поки черга стане непорожньою перед отриманням елемента з неї. Розглянемо наступний приклад.
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(); } } } }
Вихід
Added: 96 Removed: 96 Added: 8 Removed: 8 Added: 5 Removed: 5
37) Як реалізувати проблему виробник-споживач за допомогою BlockingQueue?
Проблему виробник-споживач можна вирішити за допомогою BlockingQueue наступним чином.
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) Яка різниця між інтерфейсом Java Callable та Runnable?
Інтерфейси Callable і Runnable використовуються класами, які хотіли виконувати з кількома потоками. Однак між ними є дві основні відмінності:
росомаха проти борсука
- Інтерфейс Callable може повертати результат, тоді як інтерфейс Runnable не може повертати жодного результату.
- Інтерфейс Callable може викликати перевірений виняток, тоді як інтерфейс Runnable не може створити перевірений виняток.
- Інтерфейс Callable не можна використовувати до Java 5, тоді як інтерфейс Runnable можна використовувати.
39) Що таке атомарна дія в Concurrency в Java?
- Атомарна дія — це операція, яку можна виконати в одному блоці завдання без будь-якого втручання інших операцій.
- Дію Atomic не можна зупинити між виконанням завдання. Після запуску заповнення зупиняється лише після завершення завдання.
- Операція збільшення, така як a++, не допускає атомарної дії.
- Усі операції читання та запису для примітивної змінної (крім long і double) є атомарними операціями.
- Усі операції читання та запису для змінної volatile (включаючи long і double) є атомарними операціями.
- Методи Atomic доступні в пакеті java.util.Concurrent.
40) Що таке інтерфейс блокування в API Concurrency в Java?
Як механізм синхронізації використовується інтерфейс java.util.concurrent.locks.Lock. Він працює подібно до синхронізованого блоку. Нижче наведено кілька відмінностей між блокуванням і синхронізованим блоком.
- Інтерфейс блокування забезпечує гарантію послідовності, в якій потоку, що очікує, буде надано доступ, тоді як синхронізований блок цього не гарантує.
- Інтерфейс блокування надає можливість тайм-ауту, якщо блокування не надано, тоді як синхронізований блок цього не надає.
- Методи інтерфейсу Lock, тобто Lock() і Unlock(), можна викликати в різних методах, тоді як один синхронізований блок повинен повністю міститися в одному методі.
41) Поясніть інтерфейс ExecutorService.
Інтерфейс ExecutorService є підінтерфейсом інтерфейсу Executor і додає функції для керування життєвим циклом. Розглянемо наступний приклад.
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(); } } } }
Вихід
Shutdown executor shutdown finished
42) Яка різниця між синхронним програмуванням і асинхронним програмуванням щодо потоку?
Синхронне програмування: У моделі синхронного програмування потік призначається для виконання завдання, і, отже, потік почав над ним працювати, і він доступний для інших завдань лише після завершення призначеного завдання.
Асинхронне програмування: В асинхронному програмуванні одне завдання може бути виконане декількома потоками, і, отже, це забезпечує максимальну зручність використання різних потоків.
43) Що ви розумієте під Callable і Future у Java?
Java Callable інтерфейс: У Java5 викликний інтерфейс надавався пакетом java.util.concurrent. Він схожий на інтерфейс Runnable, але може повертати результат і створювати винятки. Він також надає метод run() для виконання потоку. Java Callable може повертати будь-який об’єкт, оскільки використовує Generic.
Синтаксис:
відкритий інтерфейс Callable
Майбутній інтерфейс Java: Інтерфейс Java Future дає результат одночасного процесу. Інтерфейс Callable повертає об’єкт java.util.concurrent.Future.
Java Future надає такі методи реалізації.
44. Яка різниця між інтерфейсом ScheduledExecutorService та ExecutorService?
ExecutorServcie та ScheduledExecutorService є інтерфейсами пакета java.util.Concurrent, але scheduledExecutorService надає деякі додаткові методи для виконання завдань Runnable і Callable із затримкою або кожного фіксованого періоду часу.
45) Визначити клас FutureTask у Java?
Клас Java FutureTask забезпечує базову реалізацію інтерфейсу Future. Результат можна отримати лише за умови завершення виконання одного завдання, а якщо обчислення не досягнуто, то метод get буде заблоковано. Якщо виконання завершено, його не можна розпочати повторно та скасувати.
Синтаксис
відкритий клас FutureTask extends Object реалізує RunnableFuture
10;>