Skip to content

Instantly share code, notes, and snippets.

@honest-niceman
Last active July 23, 2024 17:29
Show Gist options
  • Save honest-niceman/148a71521544c043d4c800bf48586886 to your computer and use it in GitHub Desktop.
Save honest-niceman/148a71521544c043d4c800bf48586886 to your computer and use it in GitHub Desktop.
Netology Q&A JADV-66

Алексей:

Вопросы:

  1. Запуск потока с параметрами

Чтобы запустить поток с параметрами, нужно создать класс, реализующий интерфейс Runnable или наследующий Thread, и передать параметры через конструктор.

class MyRunnable implements Runnable {
    private String param;

    public MyRunnable(String param) {
        this.param = param;
    }

    @Override
    public void run() {
        // код, использующий param
    }
}

public class Main {
    public static void main(String[] args) {
        Thread thread = new Thread(new MyRunnable("Hello"));
        thread.start();
    }
}
  1. Как прервать поток безопасно и обязательно ли всегда ставить условие в потоке о прерывании

Прерывание потока осуществляется с помощью метода interrupt(), однако поток должен сам проверять, был ли он прерван, и корректно завершаться. Обычно это делается с помощью проверки флага Thread.currentThread().isInterrupted() внутри цикла.

public class MyRunnable implements Runnable {
    @Override
    public void run() {
        while (!Thread.currentThread().isInterrupted()) {
            // выполнение задачи
        }
        // освобождение ресурсов и завершение
    }
}

public class Main {
    public static void main(String[] args) {
        Thread thread = new Thread(new MyRunnable());
        thread.start();
        // прерывание потока
        thread.interrupt();
    }
}

И да, условие в потоке о прерывании нужно ставить всегда, чтобы обеспечить корректное завершение потока.

  1. Сколько вложенных методов может быть в блоках synchronized

Количество вложенных методов в блоках synchronized не ограничено синтаксически, но важно следить за эффективностью и избегать взаимных блокировок (deadlock).

  1. Сколько потоков можно запускать одновременно

Количество одновременно выполняемых потоков зависит от возможностей операционной системы и аппаратного обеспечения. Обычно оно определяется количеством процессоров/ядер.

  1. Имеет ли смысл использовать дженерики в потоках

Всё зависит от конкретной задачи, никаких рекомендаций по использованию/не использованию дженериков нет.

  1. Есть ли ограничения для библиотек в потоках

Некоторые библиотеки могут иметь ограничения или особенности при использовании в многопоточном окружении, особенно если они не потокобезопасны. Важно всегда проверять документацию конкретной библиотеки.

Юлия:

Вопросы:

  1. (по мотивам последнего задания) Если у меня есть ArrayList из трёх элементов, и три потока меняют каждый свой элемент (1-1, 2-2, 3-3), это же потокобезопасно само по себе, никакие обёртки не нужны? Добавление и удаление не происходят ни в какой момент времени

Если три потока изменяют каждый свой элемент в ArrayList и доступ к этим элементам не пересекается, то это может быть потокобезопасно. Однако, стандартный ArrayList не является потокобезопасным и при изменении его структуры (добавление/удаление элементов) могут возникнуть проблемы. В вашем случае, если добавление и удаление элементов не происходит, дополнительные обёртки могут не потребоваться.

  1. Есть какой-то способ сделать join() для всех запущенных потоков кроме как пройтись по массиву, где сохранены ссылки на эти потоки? Типа joinAllThreads()

В Java нет встроенного метода joinAllThreads(). Обычно используется цикл по массиву потоков:

for (Thread thread : threads) {
    thread.join();
}
  1. Что будет если не делать join()? Предположим, основной поток main закончится раньше других, а другие что, будут продолжать работать? Или main всегда неявно ждёт других?

Если не делать join(), основной поток завершится, а другие потоки продолжат выполняться до своего завершения. main поток не ждёт завершения других потоков, если это явно не указано с помощью join().

  1. Можно ли из созданного потока создавать другие потоки? Если да, то когда это осмысленно? Есть ли разница, откуда был создан поток, есть ли какая-то иерархия?

Потоки могут создавать другие потоки, это разрешено и иногда необходимо, например, при работе с задачами, требующими параллельного выполнения. Иерархия потоков не существует в явном виде, все потоки управляются Thread-менеджером JVM.

  1. Можно ли правильно решить задачу "2. Частота операций*" из блока "Работа с синхронизацией" без использования notifyAll()?

Да, можно решить без использования notifyAll(), используя другие механизмы синхронизации, такие как Lock и Condition.

  1. Какие есть подходы к написанию тестов для многопоточных приложений?
  1. https://testsigma.com/blog/concurrency-testing/
  2. https://www.blazemeter.com/blog/concurrency-testing
  3. https://www.baeldung.com/java-testing-multithreaded
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment