Cześć wszystkim! Zdecydowałem się kontynuować naukę w Javarash, mimo że znalazłem już pracę w Javie. Bloga piszę dla siebie, bardzo leniwie i, można powiedzieć, pod presją. Będę bardzo szczęśliwy, jeśli ktoś uzna to za przydatne, ale nie powinieneś używać go jako głównego źródła znajdowania odpowiedzi na pytania dotyczące poziomu.
7. Ile znasz sposobów na założenie wątku? (Wątek, uruchamialny, wywoływalny
1. Jakie są priorytety wątków?
Każdy wątek w systemie ma swój własny priorytet. Priorytet to pewna liczba w obiekcie wątku od 1 do 10, przy czym wyższa wartość oznacza wyższy priorytet. System najpierw wykonuje wątki o wyższym priorytecie, a wątki o niższym priorytecie otrzymują czas procesora tylko wtedy, gdy ich bardziej uprzywilejowane odpowiedniki są bezczynne. Z priorytetami wątków można pracować za pomocą dwóch funkcji:
void setPriority(int priority) //устанавливает приоритет потока.
Możliwe wartości priorytetów to MIN_PRIORITY, NORM_PRIORITY i MAX_PRIORITY.
int getPriority() // получает приоритет потока.
Źródło Jeśli nie określono priorytetu, wątek otrzymuje priorytet 5 - średni. Priorytet wątku nie wpływa znacząco na jego działanie, ma raczej charakter doradczy. Jeśli istnieje wiele uśpionych wątków, które należy uruchomić, maszyna Java uruchomi najpierw wątek o wyższym priorytecie. Maszyna Java zarządza wątkami według własnego uznania. Wątki o niskim priorytecie nie będą bezczynne. Po prostu otrzymają mniej czasu niż inni, ale i tak zostaną straceni. W większości przypadków wątki zawsze działają z tym samym priorytetem. Próba przyznania jednemu wątkowi więcej czasu niż innym często wskazuje na błąd architektoniczny w programie.
2. Czy można zatrzymać wątek zmniejszając jego priorytet do 0?
NIE. Zostanie rzuconyIllegalArgumentException
3. Dlaczego potrzebna jest klasa ThreadGroup?
Aby zapobiec zatrzymywaniu dowolnego wątku i przerywaniu wszystkich wątków w rzędzie, wprowadzono koncepcję „grupy wątków”. Wątek może wpływać tylko na inne wątki zawarte w tej samej grupie co on.ThreadGroup
to klasa zarządzająca grupami wątków. Takie podejście pozwala chronić wątki przed niepożądanymi zmianami. Czasami trzeba uruchomić kod, któremu nie można ufać w 100%. Dlatego wygodnie jest umieścić wszystkie wątki w osobnej grupie i zapobiec ich zakłócaniu pracy głównej grupy wątków. Innymi słowy, aby zarządzać grupami wątków
4. Do jakiej grupy wątków należy wątek główny?
main
5. Co to jest wzorzec ThreadPool
Ogólnie rzecz biorąc, wzorzecThreadPool
to grupa wątków rozwiązujących grupy problemów. Zadania są zorganizowane w kolejkę. Gdy wątek zakończy pracę nad zadaniem, żąda następnego zadania z kolejki, dopóki nie zostaną ukończone wszystkie zadania w kolejce. Po tym wątek może się zakończyć lub przejść w stan uśpienia do czasu pojawienia się w kolejce nowych zadań.
6. Po co nam klasa ThreadPoolExecutor?
Aby rozwiązać dużą liczbę małych problemów za pomocą grupy wątków. Korzystanie z klasy pozwala uniknąć marnotrawstwa zasobów komputera. Bo tworzenie własnego wątku dla każdego zadania jest mało racjonalne. Maszyna Java przydziela całkiem sporo zasobów dla każdego wątku. Innymi słowy, tworzenie i niszczenie zużytego wątku może zmarnować więcej zasobów i czasu niż samo zadanie. Programiści Java wymyślili eleganckie rozwiązanie tego problemu -ThreadPoolExecutor
. Jest to klasa, która ma w środku dwie rzeczy:
- Kolejka zadań, do której możesz dodawać zadania pojawiające się w programie.
- Pula wątków (grupa wątków) – które wykonują te zadania.
7. Ile znasz sposobów na założenie wątku? (Wątek, uruchamialny, wywoływalny
)
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. Do czego służy klasa Future?
Za pomocą tego obiektu można dowiedzieć się, czy zadanie zostało już zakończone, a także uzyskać wynik jego wykonania.boolean cancel(boolean mayInterrupt); // Останавливает задачу.
boolean isCancelled(); //zwroty true, если задача была остановлена.
boolean isDone(); //zwroty true, если выполнение задачи завершено.
V get() throws InterruptedException, ExecutionException; //zwroty результат вызова метода call Lub кидает исключение, если оно было.
9. Jakie są zalety Callable nad Runnable?
Za pomocąCallable
możemy dowiedzieć się, czy zadanie zostało zakończone i poznać jego wynik, znacznie łatwiej niż za pomocąRunnable
GO TO FULL VERSION