JavaRush /Java Blog /Random-ID /Level 28. Jawaban pertanyaan wawancara pada topik level
DefNeo
Level 36

Level 28. Jawaban pertanyaan wawancara pada topik level

Dipublikasikan di grup Random-ID
Level 28. Jawaban pertanyaan wawancara tentang topik level - 1
  1. Apa prioritas threadnya?

    Jawaban atas pertanyaan ini ada di kuliah JavaRush.

    Untuk mengoptimalkan operasi paralel thread di Java, dimungkinkan untuk menetapkan prioritas thread. Thread dengan prioritas lebih tinggi memiliki keuntungan dalam menerima waktu CPU dibandingkan thread dengan prioritas lebih rendah.

    Bekerja dengan prioritas disediakan oleh metode kelas berikut Thread:

    public final void setPriority(int newPriority)

    Menetapkan prioritas thread.

    public final int getPriority()

    Memungkinkan Anda mengetahui prioritas utas.

    Nilai suatu parameter dalam suatu metode setPrioritytidak bisa sembarangan. Harus antara MIN_PRIORITY dan MAX_PRIORITY. Saat dibuat, thread memiliki prioritas NORM_PRIORITY.

    MIN_PRIORITAS = 1.
    NORM_PRIORITAS =5.
    MAX_PRIORITAS = 10.

  2. Apakah mungkin menghentikan thread dengan mengurangi prioritasnya menjadi 0?

    Jawabannya ada di artikel: “50 pertanyaan wawancara teratas. Topik: Multithread"

    Menemukannya di forum.

    Ada versi bahasa Inggris dari artikel ini: 50 Jawaban Pertanyaan Wawancara Thread Java Teratas untuk Pemrogram Baru dan Berpengalaman

    Java menyediakan API yang kaya untuk semuanya, namun ironisnya, Java tidak menyediakan cara mudah untuk menghentikan thread. Meskipun JDK 1.0 memiliki beberapa metode kontrol, seperti stop(), suspend()dan resume(), yang ditandai tidak digunakan lagi pada rilis mendatang karena potensi ancaman kebuntuan, pengembang Java API sejak saat itu tidak berupaya untuk menyediakan cara yang kuat, aman untuk thread, dan elegan untuk menghentikan benang. Pemrogram sebagian besar mengandalkan fakta bahwa thread berhenti sendiri segera setelah selesai menjalankan metode run()atau call(). Untuk menghentikan secara manual, pemrogram memanfaatkan volatile booleanvariabel dan memeriksa nilainya di setiap iterasi jika metode run()memiliki loop, atau menginterupsi thread dengan metode tersebut interrupt()untuk membatalkan pekerjaan secara tiba-tiba.

    Khususnya pada pertanyaan: Saya belum pernah melihat orang menetapkan prioritas ke 0.

    Jika ada yang tahu tentang ini, tulis di komentar.

  3. Mengapa kita memerlukan kelas ThreadGroup?

    ThreadGroupadalah sekumpulan thread yang juga dapat berisi grup thread lainnya. Sekelompok thread membentuk sebuah pohon yang mana setiap grup thread lainnya mempunyai induk (kecuali yang asli). Sebuah thread mempunyai hak untuk mengakses data dari grup threadnya, namun tidak memiliki akses tersebut ke grup lain atau ke grup thread induknya.

  4. Termasuk dalam kelompok thread apa main-thread?

    Saya belum menemukannya di mana pun)) Katakan di mana itu))

  5. Apa itu pola ThreadPool?

    Ada kutipan tentang ini dari artikel Wikipedia:

    Dalam pemrograman komputer, pola kumpulan thread (juga model pekerja atau kru pekerja yang direplikasi) adalah tempat sejumlah thread dibuat untuk melakukan sejumlah tugas, yang biasanya diatur dalam antrian. Hasil dari tugas yang dijalankan mungkin juga ditempatkan dalam antrean, atau tugas tersebut mungkin tidak memberikan hasil apa pun (misalnya, jika tugas tersebut untuk animasi). Biasanya, ada lebih banyak tugas daripada thread. Segera setelah thread menyelesaikan tugasnya, thread akan meminta tugas berikutnya dari antrian hingga semua tugas selesai. Thread kemudian dapat dihentikan, atau tidur hingga ada tugas baru yang tersedia.

    Jumlah thread yang digunakan merupakan parameter yang dapat disetel untuk memberikan performa terbaik. Selain itu, jumlah thread dapat bersifat dinamis berdasarkan jumlah tugas yang menunggu. Misalnya, server web dapat menambahkan thread jika banyak permintaan halaman web masuk dan dapat menghapus thread ketika permintaan tersebut berkurang. Biaya untuk memiliki kumpulan thread yang lebih besar adalah peningkatan penggunaan sumber daya. Algoritme yang digunakan untuk menentukan kapan membuat atau menghancurkan thread akan berdampak pada performa keseluruhan:

    • membuat terlalu banyak thread, dan sumber daya terbuang serta waktu juga terbuang untuk membuat thread yang tidak terpakai
    • hancurkan terlalu banyak utas dan lebih banyak waktu akan dihabiskan nanti untuk membuatnya lagi
    • membuat thread terlalu lambat dapat mengakibatkan kinerja klien buruk (waktu tunggu yang lama)

    Dalam pemrograman komputer, terdapat model kumpulan thread di mana sejumlah thread dibuat untuk melakukan sejumlah tugas, yang biasanya diatur dalam antrian. Hasil dari tugas yang diselesaikan mungkin juga dimasukkan dalam antrean, atau tugas mungkin tidak memberikan hasil apa pun (misalnya, jika tugas tersebut untuk animasi).

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

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

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

    public class ThreadPoolExecutor extends AbstractExecutorService

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

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

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

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

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

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

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

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

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

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

    Листинг Creation задачи с помощью интерфейса 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(Howое-то condition) {
    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 в уже параметризованном варианте, так How в качестве типа возвращаемого значения также указан тип String. Фактически это означает, что была создана задача, результатом выполнения которой будет an object типа String (см. строку 8). Точно также можно создать задачу, в результате работы которой в методе call будет создаваться и возвращаться an object любого требуемого типа. Такое решение значительно удобнее по сравнению с методом run в интерфейсе Runnable, который не возвращает ничего (его возвращаемый тип – void) и поэтому приходится изобретать обходные пути, чтобы извлечь результат работы задачи.

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

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

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

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

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

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

    Хорошо, если мы сами пишем весь code, тогда можно в нужных местах аккуратно обрабатывать Thread.isInterrupted() и все будет ОК. Но если мы запускаем сторонний code? Если у нас есть server расширяемый с помощью плагинов? Какой-нибудь криво написанный плагин может requestто привести к неработоспособному состоянию весь server ведь мы не можем корректно прервать выполнение зависшего plugin.

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