- 執行緒優先權是什麼?
這個問題的答案在 JavaRush 講座中。
為了優化 Java 中執行緒的平行操作,可以設定執行緒優先權。具有較高優先權的執行緒比具有較低優先權的執行緒在接收 CPU 時間方面具有優勢。
以下類別方法提供了處理優先順序的功能
Thread
:public final void setPriority(int newPriority)
設定執行緒優先權。
public final int getPriority()
允許您找出線程優先級。
方法中的參數值
setPriority
不能是任意的。它必須介於 MIN_PRIORITY 和 MAX_PRIORITY 之間。創建時,執行緒具有優先權 NORM_PRIORITY。MIN_PRIORITY = 1。NORM_PRIORITY
= 5。
最大優先權 = 10。 -
是否可以透過將執行緒的優先權降低到 0 來停止該執行緒?
答案就在文章中:「前 50 個面試問題。主題:多線程”
在論壇上找到的。
本文有英文版:新手、經驗豐富的程式設計師的 Top 50 Java 線程面試問題答案
Java 為一切提供了豐富的 API,但諷刺的是,它沒有提供任何方便的方法來停止執行緒。雖然 JDK 1.0 有多種控制方法,例如
stop()
、suspend()
和resume()
,由於潛在的死鎖威脅,這些方法在未來版本中已被標記為棄用,但Java API 開發人員從那時起就沒有嘗試提供一種健壯、線程安全且優雅的方法來停止線程。程式設計師主要依賴這樣一個事實:線程一旦完成執行方法run()
或call()
. 要手動停止,程式設計師可以利用volatile boolean
該變數並在每次迭代中檢查其值(如果該方法run()
有循環),或使用該方法中斷線程interrupt()
以突然取消作業。具體來說這個問題:我從未見過有人將優先級設為0。
如果有人對此有任何了解,請在評論中寫下。
-
為什麼我們需要上課
ThreadGroup
?ThreadGroup
是一組線程,還可以包含其他線程組。一組線程形成一棵樹,其中每個其他線程組都有一個父級(原始線程組除外)。執行緒有權存取其執行緒組中的數據,但無權存取其他組或其父執行緒組。 -
它屬於哪個線程組
main-thread
?我在任何地方都沒有找到它))告訴我它在哪裡))
-
什麼是模式
ThreadPool
?維基百科上有一段關於此的文章摘錄:
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)
В компьютерном программировании есть модель пула потоков, где определенное число потоков создается для выполнения целого ряда задач, которые обычно организуются в очереди. Результаты от выполненных задач также могут быть помещены в очередь, либо задачи могут не возвращать ниHowого результата (например, если задача для анимации).
Как правило, существует гораздо больше задач, чем потоков. Как только поток завершит свою задачу, он будет запрашивать следующую задачу из очереди, пока все задачи не будут завершены. Поток может затем прерваться 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
等級 36
GO TO FULL VERSION