- 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
setPriority
tidak 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. -
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()
danresume()
, 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 metoderun()
ataucall()
. Untuk menghentikan secara manual, pemrogram memanfaatkanvolatile boolean
variabel dan memeriksa nilainya di setiap iterasi jika metoderun()
memiliki loop, atau menginterupsi thread dengan metode tersebutinterrupt()
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.
-
Mengapa kita memerlukan kelas
ThreadGroup
?ThreadGroup
adalah 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. -
Termasuk dalam kelompok thread apa
main-thread
?Saya belum menemukannya di mana pun)) Katakan di mana itu))
-
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 потоков слишком медленно, может привести к снижению производительности клиента.
-
Зачем нужен класс
ThreadPoolExecutor
?public class ThreadPoolExecutor extends AbstractExecutorService
ExecutorService
это выполняет каждую представленную задачу, используя один возможно из нескольких объединенных в пул потоков, обычно сконфигурированное использованиеExecutors
методы фабрики.Пулы потоков рассматривают две различных проблемы: они обычно обеспечивают улучшенную производительность, выполняя большие количества асинхронных задач, из-за уменьшенных издержек вызова на задачу, и они обеспечивают средство ограничения и управления ресурсами, включая потоки, использованные, выполняя набор задач. Каждый
ThreadPoolExecutor
также поддерживает немного основной статистики, такой How число завершенных задач.Whatбы быть полезным через широкий диапазон контекстов, этот класс обеспечивает много корректируемых параметров и рычагов расширяемости. Однако, программистов убеждают использовать более удобное
Executors
методы фабрикиExecutors.newCachedThreadPool()
(неограниченный пул потоков, с автоматическим восстановлением потока),Executors.newFixedThreadPool(int)
(пул потоков фиксированного размера) иExecutors.newSingleThreadExecutor()
(единственный фоновый поток), которые предварительно конфигурируют настройки для наиболее распространенных сценариев использования. -
Сколько способов создать нить вы знаете?
На уровне языка есть два способа создания нити. Объект класса
java.lang.Thread
представляет собой нить, но ей требуется задача для исполнения, которая является an objectом, реализующим интерфейсjava.lang.Runnable
. Так How классThread
реализует интерфейсRunnable
, вы можете переопределить методrun()
унаследовав ваш класс отThread
or реализовав в нём интерфейсRunnable
. -
Для чего используется класс
Future
?Future
хранит результат асинхронного вычисления. Вы можете запустить вычисление, предоставив кому-либо an objectFuture
, и забыть о нем. Владелец an objectFuture
может получить результат, когда он будет готов. -
В чем преимущества
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. -
Можно ли отменить выполнение задачи, если использовать класс
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.
DefNeo
Level 36
GO TO FULL VERSION