1. Темы и процессы
1. В чем разница между потоком и процессом:
Поток относится к единице выполнения, которая может выполнять код программы во время выполнения. На языке Java в темах есть четыре штата: беги, готово, приостановка и заканчиваются.
Процесс относится к выполняемой программе. Ниды также становятся легкими процессами, когда им есть чем заняться. У них самая маленькая единица выполнения программы. Процесс может иметь несколько потоков. Каждый поток разделяет внутреннее энергоснабжение программы (сегменты кода, сегменты данных и пространство кучи) и некоторые ресурсы на уровне процесса (например, открытые файлы), но у каждого потока есть свое собственное пространство.
2. Зачем использовать многопроцесс ? <Br /> Есть в основном следующие аспекты на уровне операционной системы:
- Использование мультипоточного времени может сократить время отклика программы. Если операция занимает много времени или застряла в долгосрочном ожидании, программа не будет реагировать на такие операции, как мышь и клавиатура. После использования многопоточного, этот трудоемкий поток может быть выделен по отдельному потоку для выполнения, что делает программу лучшей интерактивностью.
- Создание потока и переключение накладных расходов дешевле по сравнению с процессами, в то время как многопоточное оборудование очень эффективно в обмене данными.
-Мульти-CPU или многоядерные компьютеры имеют возможность выполнять многопоточные. Если используется один процесс, компьютерные ресурсы не будут повторно использованы, что приведет к огромной трате ресурсов. Использование многопоточного чтения на компьютерах с несколькими CPU может улучшить использование ЦП.
- Использование многопоточного чтения может упростить структуру программы и упростить ее понимание и поддержание.
2. Создание потоков <br />, как правило, существует три метода для реализации многопоточного, и первые два являются наиболее часто используемыми методами:
1. Унаследовать класс потока и переопределить метод run ()
Поток, по сути, является экземпляром, который реализует запускаемый интерфейс. Следует отметить, что после вызова метода start () он не сразу выполняет многопоточный код, а вместо этого заставляет запустить поток. Когда запускать многопоточный код определяется операционной системой.
Вот основные шаги:
(1) Определите подкласс класса потока и переопределите метод запуска класса. Тело метода метода прогона представляет собой задачу, которую поток хочет выполнить. Следовательно, метод run () называется корпусом исполнения.
(2) Создайте экземпляр подкласса потока, то есть создать объект потока.
(3) Вызовите метод start () объекта потока, чтобы запустить поток.
public Class TestThread Extends Thread {public void run () {System.out.println ("Hello World"); } public static void main (string [] args) {thread mthread = new TestThread (); mthread.start (); }} 2. Реализуйте запускаемый интерфейс и реализуйте метод run () интерфейса
Вот основные шаги:
(1) Настройте класс и реализуйте выполняемый интерфейс и реализуйте метод run ().
(2) Создайте экземпляр подкласса потока и создайте экземпляр объекта потока с помощью объекта, который реализует выполняемый интерфейс в качестве параметра.
(3) Метод запуска потока вызова () для запуска потока.
открытый класс testrunnable реализации runnable {public void run () {System.out.println ("Hello World"); }} public class testrunnable {public static void main (string [] args) {testrunnable mtestrunnable = new testrunnable (); Thread MTHREAD = новый поток (MTESTRUNNABLE); mthread.start (); }} 3. Реализуйте метод CALLEABLE и переопределить метод Call ()
Взаимодействующий интерфейс на самом деле является функциональным классом в рамках исполнителя. Взаимодействующий интерфейс аналогичен запускающемуся интерфейсу, но обеспечивает более мощные функции, чем запускаемые, которые в основном проявляются в следующих 3 точках:
(1) Callible может обеспечить возвратное значение после принятия задачи, и запустить не может предоставить эту функцию.
(2) Метод Call () в Callible может бросить исключения, в то время как метод run () runnable не может бросить исключения.
(3) Запуск Callable может получить будущий объект. Будущий объект представляет собой результат расчета Ибрагимовича, и он предоставляет метод, чтобы проверить, завершен ли расчет. Поскольку поток принадлежит к асинхронной модели расчета, невозможно получить возвратное значение функции из других потоков. В этом случае будущее может использоваться для мониторинга метода Call (), когда целевой поток вызывает метод Call (). Однако, когда будущий метод get () будет вызван для получения результата, текущий поток заблокирует и узнает результат возврата метода Call ().
открытый класс TestCallable {// Создать класс потока Общедоступный статический класс MyTestCallable реализации Callable {public String Call () Throws Exception {retun "Hello World"; }} public static void main (string [] args) {myTestCallable mmyTestCallable = new MyTestCallable (); Executorservice mexecutorservice = executors.newsinglethreadpool (); Будущая mfuture = mexecutorservice.submit (mmytestcallable); try {// ждать, пока поток заканчивается и верните System.out.out.println (mfuture.get ()); } catch (Exception e) {e.printstackTrace (); }}}Результатом вывода вышеуказанной программы является: Hello World
Среди этих трех методов обычно рекомендуется реализовать запускаемый интерфейс. Причина в том, что во -первых, класс потоков определяет различные методы, которые можно переписать с помощью полученных классов, но должен быть переписан только метод run (), который реализует основную функцию этого потока, который также является методом, необходимым для реализации запускаемого интерфейса. Во -вторых, класс должен быть унаследован, когда их нужно укреплять или модифицировать. Следовательно, если нет необходимости переопределять другие методы класса потоков, в этом случае лучше реализовать запускаемый интерфейс.
3. Поток прерывания <br /> Поток завершится, когда метод run () run () выполняет последнее оператор в теле метода и возвращает, выполняя оператор возврата, или когда исключение, которое не попадает в метод, не захвачено. В более ранних версиях Java был метод остановки, которые другие потоки могли вызвать, чтобы прекратить поток, но этот метод теперь устарел.
Метод прерывания может использоваться для запроса завершения потока. Когда поток вызывает метод прерывания, состояние прерывания потока будет установлено. Это логический флаг, который нет ни в нити. Каждый поток должен время от времени проверять этот флаг, чтобы определить, прерывается ли поток.
Чтобы выяснить, установлен ли поток, вы можете вызвать Thread.currentThread (). IsErengrupted ():
while (! Thread.currentThread (). isErengeTrupted ()) {сделать что -нибудь} Однако, если поток блокируется, состояние прерывания не может быть обнаружено. Здесь генерируется прерванная экспрессия. Когда метод прерывания вызывается в заблокированном потоке (называемый сон или ожидание). Блокирующий вызов будет прерван прерыванием.
Если после каждой итерации вызывается метод сна (или другой прерывистый метод), обнаруженное обнаружение не нужно и бесполезно. Если метод сна вызывается при установке состояния прерывания, он не будет спать, но очистит состояние и бросит прерывание. Поэтому, если вы звоните в петлю, не обнаруживайте статус прерывания, просто поймайте прерывание.
Во многих опубликованных кодах вы обнаружите, что прерванная экспрессация подавляется на очень низком уровне:
void mytask () {... try {sleep (50)} catch (прерывание Exception e) {...}}Не делай этого. Если вы не думаете, что есть какая -либо выгода в улова, есть два разумных варианта:
Call Thread.currentThread (). Urtrupr () в уловке, чтобы установить состояние прерывания. Абоненты могут обнаружить это. Лучшим вариантом является использование Thr ThroptedException для обозначения вашего метода, без использования блоков операторов Try для захвата завершенного. Таким образом, звонящий может поймать это исключение:
void mytask () throp retruptedException {sleep (50)}4. Состояние потока
(1). Новый статус (новый): создан новый объект потока.
(2). Готовное состояние (запустить): после создания объекта потока другие потоки вызывают метод start () объекта. Поток в этом состоянии расположена в пуле запускаемых потоков и становится запускаемой, ожидая, чтобы получить права на использование ЦП.
(3). Заводящее состояние: поток в штате Готово приобретает процессор и выполняет код программы.
(4). Заблокированное состояние: заблокированное состояние означает, что поток по какой -то причине отдает права на использование ЦП и временно прекращается. Только когда поток не вступит в состояние готового состояния, у нее есть шанс перейти в состояние бега. Есть три типа блокировки:
- В ожидании блокировки: работающий поток выполняет метод wait (), и JVM поместит поток в бассейн ожидания.
- Синхронное блокирование: когда работающий поток получает блокировку синхронизации объекта, если блокировка синхронизации занята другими потоками, JVM помещает потоку в пул блокировки.
- Другое блокировка: когда работающий поток выполняет метод Sleep () или join () или выпускает запрос ввода/вывода, JVM установит поток в состояние блокировки. Когда состояние Sleep () истекло, join () ждал, пока поток заканчивается или истекло, или обработка ввода-вывода была завершена, поток снова въехал в состояние готового состояния.
(5). Мертвое состояние: поток завершил выполнение или выход метода run () из -за исключения, и поток заканчивает свой жизненный цикл.
5. Приоритет потока и потока демона
1. Приоритет потока
В Java каждый поток имеет приоритет, и по умолчанию поток наследует приоритет своего родительского класса. Вы можете использовать метод SetPriority для увеличения или уменьшения любого приоритета потока. Приоритет может быть установлен на любом значении между min_priority (определено как 1 в классе потока) и max_priority (определено как 10 в классе потока). Приоритетом по умолчанию потоков является norm_priority (определяется как 5 в классе потока).
Старайтесь не полагаться на приоритет. Если вы действительно хотите его использовать, вы должны избежать общей ошибки, которую совершат новички. Если несколько высокоприоритетных потоков не входят в неактивное состояние, нити низкого приоритета никогда не могут быть выполнены. Всякий раз, когда планировщик решает запустить новую ветку, он сначала выбирает среди потоков с приоритетом, хотя это полностью проголодает нити с низким приоритетом.
2. Демон Тейд
Вызовать SetDaemon (true); Преобразует поток в потоку демона. Единственная цель потоков демонов - предоставлять услуги другим потокам. Поток времени является примером. Он регулярно отправляет сигналы в другие потоки или очищает устаревшие потоки, которые сообщают элементы кэша. Когда остаются только потоки демона, виртуальная машина выходит, потому что, если остаются только потоки демона, нет необходимости продолжать запускать программу.
Кроме того, сборник мусора JVM, управление памятью и другие потоки являются потоками демон. Кроме того, при выполнении приложений базы данных используемый пул соединений базы данных также содержит много фоновых потоков, мониторинг количества подключений, времени ожидания, статуса и т. Д.
Выше приведено об определении потока, состоянии и свойствах многопоточного чтения Java. Я надеюсь, что это будет полезно для каждого обучения.