JavaRush /Java блог /Random UA /Рівень 28. Відповіді на запитання до співбесіди на тему р...
zor07
31 рівень
Санкт-Петербург

Рівень 28. Відповіді на запитання до співбесіди на тему рівня

Стаття з групи Random UA
Всім привіт! Вирішив продовжити навчання на джавараші, незважаючи на те, що роботу з java я вже знайшов. Рівень 28. Відповіді на запитання до співбесіди на тему рівня - 1Цей блог я веду для самого себе, дуже ліниво, і, можна сказати, з-під палиці. Я буду дуже радий, якщо він виявиться для когось корисним, проте не варто використовувати його як основне джерело для пошуку відповідей на питання рівня.

1. Які пріоритети ниток бувають?

Кожен потік у системі має свій пріоритет. Пріоритет - це деяке число в об'єкті потоку від 1 до 10, вище значення якого означає більший пріоритет. Система в першу чергу виконує потоки з більшим пріоритетом, а потоки з меншим пріоритетом отримують процесорний час тільки тоді, коли більш привілейовані побратими простоюють. Працювати з пріоритетами потоку можна за допомогою двох функцій:
void setPriority(int priority) //устанавливает приоритет потока.
Можливі значення priority - MIN_PRIORITY, NORM_PRIORITY та MAX_PRIORITY.
int getPriority() // получает приоритет потока.
Джерело Якщо пріоритет не заданий, нитку отримує пріоритет 5 - середній. Пріоритет нитки не сильно впливає на її роботу, а має радше рекомендаційний характер. Якщо є кілька сплячих ниток, які потрібно запустити, Java-машина спочатку запустить нитку з вищим пріоритетом. Java-машина управляє нитками так, як вважатиме за потрібне. Нитки з низьким пріоритетом не простоюватимуть. Просто вони отримуватимуть менше часу, ніж інші, але виконуватимуться все одно. Найчастіше нитки завжди виконуються з однаковим пріоритетом. Спроба дати одній нитці більше часу, ніж іншим, часто свідчить про архітектурну помилку програми.

2. Чи можна зупинити нитку, знизивши пріоритет її до 0?

Ні. Буде покинутоIllegalArgumentException

3. Навіщо потрібний клас ThreadGroup?

Щоб будь-яка нитка не могла зупиняти і переривати всі нитки поспіль, було запроваджено поняття «групи ниток». Нитка може впливати тільки інші нитки, які у тій самій групі, як і вона. ThreadGroup- Це клас, який управляє групами ниток. Такий підхід дозволяє захистити нитки від небажаної зміни. Іноді доводиться виконувати код, якому не можна довіряти 100%. Тому зручно помістити всі нитки в окрему групу і заборонити їм втручатися в роботу основної групи ниток. Іншими словами для управління групами потоків

4. У якій групі ниток полягає main-thread?

main

5. Що таке патерн ThreadPool

Паттерн ThreadPoolзагальними словами – група потоків, які вирішують групи завдань. Завдання організовані у чергу. Як тільки потік завершує роботу над завданням, він запитує наступне завдання з черги, доки всі завдання в черзі не будуть виконані. Після цього потік може завершитися або заснути, доки в черзі не з'являться нові завдання.

6. Навіщо потрібний клас ThreadPoolExecutor?

Щоб розв'язати велику кількість невеликих завдань групою потоків. Використання класу дозволяє уникати марнотратного використання ресурсів машини. Тк Створювати для кожного завдання свою нитку не дуже раціонально. Для кожної нитки Java-машина виділяє чимало ресурсів. Іншими словами - створення і знищення нитки, що відпрацювала, може витрачати більше ресурсів і часу, ніж саме виконуване завдання. Java-розробники придумали елегантне вирішення цієї проблеми ThreadPoolExecutor. Це клас, який має всередині дві речі:
  • Черга завдань, до яких можна додавати завдання, у міру їх появи у програмі.
  • Пул-ниток (група ниток) – які ці завдання виконують.
При цьому нитки не знищуються після виконання завдання, а засипають. Щоб почати виконувати нове завдання, як воно з'явиться.

7. Скільки способів створити нитку ви знаєте? (Thread, Runnable, Callable )

public class ThreadsTests {
    //Способ 1
    static class ThreadExampleRunnable implements Runnable{
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName());
        }
    }

    //Способ 2
    static class ThreadExampleFromThread extends Thread {
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName());
        }
    }

    //Способ 3
    static class ThreadExampleFromCallable implements Callable{
        @Override
        public String call() throws Exception {
            return Thread.currentThread().getName();
        }
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        new Thread(new ThreadExampleRunnable()).start(); //Способ 1
        new ThreadExampleFromThread().start(); //Способ 2

        //Способ 3
        ExecutorService service = Executors.newFixedThreadPool(5);
        Future task = service.submit(new ThreadExampleFromCallable());
        System.out.println(task.get());

    }
}

8. Навіщо використовується клас Future?

Цей об'єкт можна використовувати, щоб дізнатися, чи завершилося виконання завдання, а також, щоб отримати результат його виконання. boolean cancel(boolean mayInterrupt); // Останавливает задачу.
boolean isCancelled(); //Повертає true, если задача была остановлена.
boolean isDone(); //Повертає true, если выполнение задачи завершено.
V get() throws InterruptedException, ExecutionException; //Повертає результат вызова метода call або кидает исключение, если оно было.

9. У чому переваги Callable над Runnable?

Використовуючи Callableми можемо дізнатися чи завершилося завдання, і дізнатися її результат, набагато простіше, ніж при використанніRunnable

10. Чи можна скасувати виконання завдання, якщо використовувати клас Future?

Можна, якщо завдання лежить у черзі і чекає на своє виконання, інакше не факт
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ