JavaRush /Blog Java /Random-PL /Poziom 28. Odpowiedzi na pytania podczas rozmowy kwalifik...
DefNeo
Poziom 36

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

Opublikowano w grupie Random-PL
Poziom 28. Odpowiedzi na pytania z rozmowy kwalifikacyjnej na temat poziomu - 1
  1. Jakie są priorytety wątków?

    Odpowiedź na to pytanie znajduje się w wykładach JavaRush.

    Aby zoptymalizować równoległe działanie wątków w Javie, możliwe jest ustawienie priorytetów wątków. Wątki o wyższym priorytecie mają przewagę w odbieraniu czasu procesora w porównaniu z wątkami o niższym priorytecie.

    Pracę z priorytetami umożliwiają następujące metody klasowe Thread:

    public final void setPriority(int newPriority)

    Ustawia priorytet wątku.

    public final int getPriority()

    Umożliwia sprawdzenie priorytetu wątku.

    Wartość parametru w metodzie setPrioritynie może być dowolna. Musi należeć do zakresu od MIN_PRIORITY do MAX_PRIORITY. Po utworzeniu wątek ma priorytet NORM_PRIORITY.

    MIN_PRIORITY = 1.
    NORM_PRIORITY =5.
    MAX_PRIORITY = 10.

  2. Czy można zatrzymać wątek, zmniejszając jego priorytet do 0?

    Odpowiedź znajdziesz w artykule: „50 najważniejszych pytań na rozmowie kwalifikacyjnej. Temat: Wielowątkowość"

    Znalazłem to na forum.

    Dostępna jest angielska wersja tego artykułu: 50 najważniejszych pytań do rozmów kwalifikacyjnych dotyczących języka Java Odpowiedzi dla nowicjuszy i doświadczonych programistów

    Java zapewnia bogate interfejsy API do wszystkiego, ale jak na ironię, nie zapewnia żadnych wygodnych sposobów zatrzymywania wątku. Chociaż JDK 1.0 miał kilka metod kontroli, takich jak i stop(), które w przyszłych wydaniach zostały oznaczone jako przestarzałe ze względu na potencjalne zagrożenie zakleszczeniem, programiści Java API od tego czasu nie podejmowali żadnych prób zapewnienia solidnego, bezpiecznego dla wątków i eleganckiego sposobu zatrzymywania wątki. Programiści polegają głównie na tym, że wątek zatrzymuje się, gdy tylko zakończy wykonywanie metod lub . Aby zatrzymać ręcznie, programiści korzystają ze zmiennej i sprawdzają jej wartość w każdej iteracji, jeśli metoda zawiera pętle, lub przerywają wątki za pomocą metody , aby nagle anulować zadania.suspend()resume()run()call()volatile booleanrun()interrupt()

    Konkretnie na pytanie: nigdy nie widziałem, żeby ktoś ustawił priorytet na 0.

    Jeżeli ktoś coś wie na ten temat niech napisze w komentarzu.

  3. Dlaczego potrzebujemy zajęć ThreadGroup?

    ThreadGroupto zbiór wątków, który może zawierać także inne grupy wątków. Grupa wątków tworzy drzewo, w którym każda inna grupa wątków ma rodzica (z wyjątkiem pierwotnej). Wątek ma prawo dostępu do danych ze swojej grupy wątków, ale nie ma takiego dostępu do innych grup ani do swojej nadrzędnej grupy wątków.

  4. Do jakiej grupy wątków należy main-thread?

    Nigdzie tego nie znalazłem)) Powiedz mi gdzie to jest))

  5. Co to jest wzór ThreadPool?

    Jest fragment na ten temat z artykułu na Wikipedii:

    In computer programming, the thread pool pattern (also replicated workers or worker-crew model) is where a number of threads are created to perform a number of tasks, which are usually organized in a queue. The results from the tasks being executed might also be placed in a queue, or the tasks might return no result (for example, if the task is for animation). Typically, there are many more tasks than threads. As soon as a thread completes its task, it will request the next task from the queue until all tasks have been completed. The thread can then terminate, or sleep until there are new tasks available.

    The number of threads used is a parameter that can be tuned to provide the best performance. Additionally, the number of threads can be dynamic based on the number of waiting tasks. For example, a web server can add threads if numerous web page requests come in and can remove threads when those requests taper down. The cost of having a larger thread pool is increased resource usage. The algorithm used to determine when to create or destroy threads will have an impact on the overall performance:

    • create too many threads, and resources are wasted and time also wasted creating any unused threads
    • destroy too many threads and more time will be spent later creating them again
    • creating threads too slowly might result in poor client performance (long wait times)

    В компьютерном программировании есть модель пула потоков, где определенное число потоков создается для выполнения целого ряда задач, которые обычно организуются в очереди. Результаты от выполненных задач также могут быть помещены в очередь, либо задачи могут не возвращать ниJakого результата (например, если задача для анимации).

    Как правило, существует гораздо больше задач, чем потоков. Как только поток завершит свою задачу, он будет запрашивать следующую задачу из очереди, пока все задачи не будут завершены. Поток может затем прерваться Lub заснуть. Количество используемых потоков, это параметр, который может быть настроен, для обеспечения наилучшей производительности. Кроме того, число потоков может быть динамическим на основе количества возникающих задач. Например, веб-serwer может добавлять потоки, если wniosekы многочисленных веб-страниц приходят и может удалить потоки, когда этих wniosekов становится меньше. С увеличением размера пула потоков увеличивается использование ресурсов компьютера. Алгоритм, используемый для определения того, когда создавать Lub уничтожать потоки, будет иметь влияние на общую производительность: - Создать слишком много потоков значит тратить ресурсы и время впустую.

    Уничтожить слишком много потоков и больше времени будет потрачено позже снова для их создания - kreacja потоков слишком медленно, может привести к снижению производительности клиента.

  6. Зачем нужен класс ThreadPoolExecutor?

    public class ThreadPoolExecutor extends AbstractExecutorService

    ExecutorService это выполняет каждую представленную задачу, используя один возможно из нескольких объединенных в пул потоков, обычно сконфигурированное использование Executors методы фабрики.

    Пулы потоков рассматривают две различных проблемы: они обычно обеспечивают улучшенную производительность, выполняя большие количества асинхронных задач, из-за уменьшенных издержек вызова на задачу, и они обеспечивают средство ограничения и управления ресурсами, включая потоки, использованные, выполняя набор задач. Каждый ThreadPoolExecutor также поддерживает немного основной статистики, такой Jak число завершенных задач.

    Coбы быть полезным через широкий диапазон контекстов, этот класс обеспечивает много корректируемых параметров и рычагов расширяемости. Однако, программистов убеждают использовать более удобное Executors методы фабрики Executors.newCachedThreadPool() (неограниченный пул потоков, с автоматическим восстановлением потока), Executors.newFixedThreadPool(int) (пул потоков фиксированного размера) и Executors.newSingleThreadExecutor() (единственный фоновый поток), которые предварительно конфигурируют настройки для наиболее распространенных сценариев использования.

  7. Сколько способов создать нить вы знаете?

    На уровне языка есть два способа создания нити. Объект класса java.lang.Thread представляет собой нить, но ей требуется задача для исполнения, которая является obiektом, реализующим интерфейс java.lang.Runnable. Так Jak класс Thread реализует интерфейс Runnable, вы можете переопределить метод run() унаследовав ваш класс от Thread Lub реализовав в нём интерфейс Runnable.

  8. Для чего используется класс Future?

    Future хранит результат асинхронного вычисления. Вы можете запустить вычисление, предоставив кому-либо obiekt Future, и забыть о нем. Владелец obiektа Future может получить результат, когда он будет готов.

  9. В чем преимущества Callable над Runnable?

    Ссылка: Часть 2. Выполнение задач в многопоточном режиме

    Интерфейс Callable гораздо больше подходит для создания задач, предназначенных для параллельного выполнения, нежели интерфейс Runnable Lub тем более класс Thread. При этом стоит отметить, что возможность добавить подобный интерфейс появилась только начиная с версии Java 5, так Jak ключевая особенность интерфейса Callable – это использование параметризованных типов (generics), Jak показано в листинге.

    Листинг kreacja задачи с помощью интерфейса Callable
    10	1 import java.util.concurrent.Callable;
    11	2 public class CallableSample implements Callable{
    12	3     public String call() throws Exception {
    13	4         if(Jakое-то stan) {
    14	5             throw new IOException("error during task processing");
    15	6         }
    16	7         System.out.println("task is processing");
    17	8         return "result ";
    18	9     }
    19	10 }
    

    Сразу необходимо обратить внимание на строку 2, где указано, что интерфейс Callable является параметризованным, и его конкретная реализация – класс CallableSample, зависит от типа String. На строке 3 приведена сигнатура основного метода call в уже параметризованном варианте, так Jak в качестве типа возвращаемого значения также указан тип String. Фактически это означает, что была создана задача, результатом выполнения которой будет obiekt типа String (см. строку 8). Точно также можно создать задачу, в результате работы которой в методе call будет создаваться и возвращаться obiekt любого требуемого типа. Такое решение значительно удобнее по сравнению с методом run в интерфейсе Runnable, который не возвращает ничего (его возвращаемый тип – void) и поэтому приходится изобретать обходные пути, чтобы извлечь результат работы задачи.

    Еще одно преимущество интерфейса Callable – это возможность «выбрасывать» исключительные ситуации, не оказывая влияния на другие выполняющиеся задачи. На строке 3 указано, что из метода может быть «выброшена» исключительная ситуация типа Exception, что фактически означает любую исключительную ситуацию, так Jak все исключения являются потомками java.lang.Exception. На строке 5 эта возможность используется для создания контролируемой (checked) исключительной ситуации типа IOException. Метод run интерфейса Runnable вообще не допускал выбрасывания контролируемых исключительных ситуаций, а выброс неконтролируемой (runtime) исключительной ситуации приводил к остановке потока и всего Aplikacje.

  10. Можно ли отменить выполнение задачи, если использовать класс Future?

    Исходя из этой дискуссии, поднятой на хабре, выходит, что нельзя.

    У Future есть метод Future.cancel(boolean), который должен отменить выполнение задачи. Но если задача уже начала выполняться, вызов Future.cancel(true) на самом деле не остановит ее. В недрах реализации FutureTask выполняется kod:

    if (mayInterruptIfRunning) {
    Thread r = runner;
    if (r != null)
    r.interrupt(); }

    Т.е. опять потоку, в котором выполняется задача, всего лишь рекомендуется прекратить выполнение. К тому же, мы не имеем даже возможности узнать выполняется ли задача в данный момент Lub нет. Есть, метод Future.isDone(), но опять мимо, он возвращает true не только когда задача завершила выполнение, а сразу после вызова Future.cancel(), даже если задача все еще выполняется (ведь Future.cancel(true) не останавливает задачу которая уже начала выполняться).

    Хорошо, если мы сами пишем весь kod, тогда можно в нужных местах аккуратно обрабатывать Thread.isInterrupted() и все будет ОК. Но если мы запускаем сторонний kod? Если у нас есть serwer расширяемый с помощью плагинов? Какой-нибудь криво написанный плагин может wniosekто привести к неработоспособному состоянию весь serwer ведь мы не можем корректно прервать выполнение зависшего podłącz.

Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION