Всім привіт! Вирішив продовжити навчання на джавараші, незважаючи на те, що роботу з java я вже знайшов. Цей блог я веду для самого себе, дуже ліниво, і, можна сказати, з-під палиці. Я буду дуже радий, якщо він виявиться для когось корисним, проте не варто використовувати його як основне джерело для пошуку відповідей на питання рівня.
7. Скільки способів створити нитку ви знаєте? (Thread, Runnable, Callable
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
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ