JavaRush /Blog Java /Random-PL /Poziom 28. Odpowiedzi na pytania podczas rozmowy kwalifik...
zor07
Poziom 31
Санкт-Петербург

Poziom 28. Odpowiedzi na pytania podczas rozmowy kwalifikacyjnej na temat poziomu

Opublikowano w grupie Random-PL
Cześć wszystkim! Zdecydowałem się kontynuować naukę w Javarash, mimo że znalazłem już pracę w Javie. Poziom 28. Odpowiedzi na pytania z rozmowy kwalifikacyjnej na temat poziomu - 1Bloga 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.

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. ThreadGroupto 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, wzorzec ThreadPoolto 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.
W takim przypadku nici nie ulegają zniszczeniu po wykonaniu zadania, ale zasypiają. Aby rozpocząć wykonywanie nowego zadania, gdy tylko się ono pojawi.

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ą Callablemożemy dowiedzieć się, czy zadanie zostało zakończone i poznać jego wynik, znacznie łatwiej niż za pomocąRunnable

10. Czy można anulować wykonanie zadania, jeśli skorzystamy z klasy Future?

Jest to możliwe, jeśli zadanie znajduje się w kolejce i oczekuje na wykonanie, w przeciwnym razie nie jest to faktem
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION