Эта статья помогает вам овладеть основными знаниями о многопользовательской чтении Java, чтобы соответствовать проблемам, с которыми вы столкнетесь в будущем. Конкретный контент заключается в следующем
1. Java многопоточные вопросы интервью
1. В чем разница между процессом и потоком?
Процесс - это самостоятельная работающая среда, которая может рассматриваться как программа или приложение. Поток - это задача, которая выполняется в процессе. Среда выполнения Java - это единственный процесс, который содержит разные классы и программы. Ниды можно назвать легкими процессами. Поток требует меньше ресурсов для создания и проживания в процессе, и они могут делиться ресурсами в процессе.
2. Каковы преимущества многопоточного программирования?
В многопоточной программе несколько потоков выполняются одновременно для повышения эффективности программы, а ЦП не будет входить в состояние холостого хода, потому что определенный поток должен ждать ресурсов. Несколько потоков разделяют память кучи, поэтому создание нескольких потоков для выполнения некоторых задач лучше, чем создание нескольких процессов. Например, сервлеты лучше, чем CGI, потому что сервлеты поддерживают многопоточную чткость, а CGI - нет.
3. В чем разница между пользовательскими потоками и потоками демона?
Когда мы создаем ветку в программе Java, он называется пользовательским потоком. Поток демона - это поток, который выполняется в фоновом режиме и не блокирует прекращенную JVM. Когда пользовательский поток не работает, JVM закрывает программу и выходит. Детская нить, созданная потоком демона, по -прежнему остается нитью демон.
4. Как мы создаем ветку?
Существует два способа создания потоков: один из них - реализовать выполняемый интерфейс, затем передать его конструктору потока и создать объект потока; Другой - непосредственно наследовать класс потоков. Для получения дополнительной информации вы можете прочитать эту статью о том, как создавать потоки в Java.
5. Каковы различные жизненные циклы потока?
Когда мы создаем новую ветку в программе Java, его статус новый. Когда мы называем метод start () потока, состояние изменяется на выполнение. Планировщик потока выделяет время ЦП на потоки в пуле запускаемых потоков и изменяет свое состояние на работу. Другие состояния потока включают ожидание, заблокированное и мертвые. Прочитайте эту статью, чтобы узнать больше о жизненных циклах потоков.
6. Могу ли я напрямую вызвать метод run () класса потока?
Конечно, но если мы вызовым метод потока потока (), он будет вести себя так же, как и обычный метод. Чтобы выполнить наш код в новом потоке, необходимо использовать метод Thread.start ().
7. Как сделать паузу бегущего потока в течение определенного периода времени?
Мы можем использовать метод Sleep () класса потока, чтобы приостановить поток в течение определенного периода времени. Следует отметить, что это не приводит к прекращению поток. После того, как поток будет пробужден от спячки, состояние потока будет изменено на запуск, и в соответствии с планированием потока оно будет выполнено.
8. Как вы понимаете приоритет потока?
Каждый поток имеет приоритет. Вообще говоря, высокоприоритетные потоки будут иметь приоритет при запуске, но это зависит от реализации планирования потоков, которая связана с операционной системой (ОС зависит). Мы можем определить приоритет потоков, но это не гарантирует, что высокоприоритетные потоки будут выполняться перед темами низкого приоритета. Приоритет потока является переменной int (от 1-10), 1 представляет самый низкий приоритет, а 10 представляет самый высокий приоритет.
9. Что такое планировщики потоков и нарезка времени?
Планировщик потоков - это служба операционной системы, которая отвечает за распределение времени ЦП на потоки в запущенном состоянии. Как только мы создаем поток и запускаем его, его выполнение зависит от реализации планировщика потока. Время Sharding относится к процессу выделения доступного времени процессора по доступным потокам. Выделенное время ЦП может быть основано на приоритете потока или времени ожидания потока. Планирование потоков не контролируется виртуальными машинами Java, поэтому лучше управлять им при приложении (то есть не позволяйте вашей программе зависеть от приоритетов потока).
10. В многопользовании, что такое переключение контекста?
Контекст переключение - это процесс хранения и восстановления состояния процессора, который позволяет выполнять потока возобновить выполнение из точек прерывания. Контекст-переключение является основной особенностью многозадачных операционных систем и многопоточных сред.
11. Как вы убедитесь, что поток, где находится метод Main (), является последним потоком, который заканчивается в программе Java?
Мы можем использовать метод совместного () класса потока, чтобы убедиться, что все потоки, созданные в конце программы, до выхода метода Main (). Вот статья о методе совместного () класса потока.
12. Как передаются потоки?
Когда межпоточные ресурсы могут быть переданы, межпоточная связь является важным средством их координации. Метод wait ()/notify ()/notifyall () в классе объекта может использоваться для общения между потоками о состоянии замков о ресурсах. Нажмите здесь, чтобы узнать больше о потоке, подождите, уведомить и уведомлять.
13. Почему методы связи потока ожидают (), notify () и notifyall (), определенные в классе объекта?
Каждый объект в Java имеет блокировку (монитор, который также может быть монитором) и wait (), notify (), а другие методы используются для ожидания блокировки объекта или уведомления других объектов потока. Для любого объекта для использования в потоках Java не доступны замки и синхронизаторы. Вот почему эти методы являются частью объектного класса, так что каждый класс в Java имеет основные методы для межпоточной связи
14. Зачем ждать (), уведомлять () и уведомлять (), чтобы вызвать в методе синхронизации или в блоке синхронизации?
Когда поток должен вызвать метод wait () объекта, поток должен иметь блокировку объекта. Затем он выпускает блокировку объекта и входит в состояние ожидания, пока другие потоки не вызовут метод notify () на объект. Аналогичным образом, когда поток должен вызвать метод объекта notify (), он отпустит блокировку объекта, чтобы другие потоки ожидали, чтобы получить блокировку объекта. Поскольку все эти методы требуют, чтобы потоки удержали блокировку объекта, они могут быть реализованы только посредством синхронизации, поэтому их можно вызвать только в методе синхронизации или в блоке синхронизации.
15. Почему методы Sleep () и урожайности () класса потока статичны?
Методы Sleep () и hirl () класса потока будут выполняться в текущем выполнении. Поэтому не имеет смысла называть эти методы в других темах, которые находятся в состоянии ожидания. Вот почему эти методы статичны. Они могут работать в текущем выполнении и избежать ошибочной убеждения программиста, что эти методы можно вызвать в других непрерывных темах.
16. Как обеспечить безопасность потока?
Существует много способов обеспечить безопасность потока в Java - синхронизация, использование атомных параллельных классов, реализации одновременных блокировков, используйте летучие ключевые слова, используйте инвариантные классы и безопасные для потока классы. Вы можете узнать больше в учебном пособии по безопасности.
17. Какова роль нестабильного ключевого слова в Java?
Когда мы используем летучие ключевое слово для изменения переменной, поток напрямую будет считывать переменную и не кэширует его. Это гарантирует, что переменные, считываемые потоком, соответствуют памяти.
18. Какой выбор лучше, метод синхронизации или блок синхронизации?
Синхронные блоки - лучший выбор, потому что он не заблокирует весь объект (и, конечно, вы также можете позволить ему заблокировать весь объект). Метод синхронизации блокирует весь объект, даже если в классе есть несколько неродственных блоков синхронизации, что обычно заставляет их прекратить выполнение и необходимо ждать, чтобы получить блокировку на объекте.
19. Как создать ветку демона?
Используйте метод SetDaemon (true) класса потока в SetDaemon (true), чтобы установить поток в виде потока демона. Следует отметить, что этот метод должен быть вызван перед вызовом метода start (), в противном случае будет брошено нелегальное летающее средство.
20. Что такое Threadlocal?
Threadlocal используется для создания локальных переменных для потоков. Мы знаем, что все потоки объекта будут делиться своими глобальными переменными, поэтому эти переменные не безопасны для потока, и мы можем использовать методы синхронизации. Но когда мы не хотим использовать синхронизацию, мы можем выбрать трендокальную переменную.
Каждый поток будет иметь свои собственные переменные потока, которые могут использовать метод get ()/set (), чтобы получить значения по умолчанию или изменить их значения внутри. Темолокальные экземпляры обычно хотят, чтобы они были связаны с состоянием потока как частные статические атрибуты. В этой статье вы можете увидеть небольшую программу о Threadlocal.
21. Что такое группа потоков? Почему это не рекомендуется?
ThreadGroup - это класс, цель которого состоит в том, чтобы предоставить информацию о группах потоков.
API ThreadGroup относительно слабый, и он не предлагает больше функций, чем потока. Он имеет две основные функции: одна из них - получить список активных потоков в группе потоков; Другой - установить обработчик исключений на Uncaught для потоков. Однако в Java 1.5 класс потоков также добавил метод setuncaughtexceptionhandler (uncaughtexceptionhandler eh), поэтому Threadgroup устарела, и не рекомендуется продолжать использовать его.
t1.setuncaughtexceptionHandler (new UncaughtexceptionHandler () {@Override public void uncaughtexception (Thread T, Throwable e) {System.out.println ("Исключение произошло:"+e.getMessage ());}}); 22. Что такое джавовая свалка и как ее получить?
Дамп потока - это список активных потоков JVM, которые очень полезны для анализа узких мест и тупиков системы. Есть много способов получить дампы потоков - использование профилировщика, команды Kill -3, инструмента JStack и т. Д. Я предпочитаю инструмент JStack, потому что он прост в использовании и поставляется с JDK. Поскольку это инструмент на основе терминала, мы можем написать несколько сценариев для своевременного генерации дамп потоков для анализа. Прочитайте этот документ, чтобы узнать больше о создании дамп потоков.
23. Что такое тупик? Как проанализировать и избежать тупиков?
Законный тупик относится к ситуации, когда более двух потоков блокируется навсегда. Эта ситуация требует как минимум двух потоков и более двух ресурсов.
Чтобы проанализировать тупики, нам нужно просмотреть дамп потока приложения Java. Нам нужно выяснить эти потоки с заблокированным государством и ресурсами, которые они ждут. Каждый ресурс имеет уникальный идентификатор. Используя этот идентификатор, мы можем выяснить, какие потоки уже имеют блокировку объекта.
Избегать вложенных замков, использование только замков, где они необходимы, и избегание неопределенного ожидания - это обычные способы избежать тупиков, прочитайте эту статью, чтобы узнать, как анализировать тупики.
24. Что такое класс таймера Java? Как создать задачу с определенным временным интервалом?
java.util.timer - это класс инструментов, который можно использовать для планирования потока для выполнения в определенное время в будущем. Класс таймера может быть организован путем планирования единовременных задач или периодических задач.
java.util.timertask - это абстрактный класс, который реализует запускаемый интерфейс. Нам нужно унаследовать этот класс, чтобы создать наши собственные задачи по времени и использовать таймер, чтобы организовать его выполнение.
25. Что такое бассейн потоков? Как создать бассейн потоков Java?
Пул потоков управляет набором рабочих потоков, а также включает очередь для размещения задач, ожидающих выполнения.
java.util.concurrent.executors предоставляет реализацию интерфейса java.util.concurrent.executor для создания пулов потоков. Пример пула потоков показывает, как создавать и использовать пул потоков, или прочитать пример reduledThreadPoolexeCutor, чтобы узнать, как создать периодическую задачу.
2. Вопросы по параллельным интервью Java
1. Что такое атомная операция? Какие атомные классы в API параллелизма Java?
Атомная операция относится к операционной задаче, на которую не влияют другие операции. Атомные операции являются необходимым средством, чтобы избежать несоответствия данных в многопоточной среде.
Int ++ не является атомной операцией, поэтому, когда поток считывает свое значение и добавляет 1, другой поток может прочитать предыдущее значение, которое вызовет ошибку.
Чтобы решить эту проблему, необходимо убедиться, что операция добавления атомана, и мы могли бы использовать технологию синхронизации для этого до JDK1.5. Для JDK1.5, пакет java.util.concurrent.atomic обеспечивает INT и длинные типы классов загрузки, что может автоматически гарантировать, что они атомны для своих операций и не требуют синхронизации.
2. Что такое интерфейс блокировки в API параллелизма Java? Каковы преимущества сравнения синхронизации?
Интерфейс блокировки обеспечивает более масштабируемую операцию блокировки, чем метод синхронизации и блок синхронизации. Они допускают более гибкие структуры, могут иметь совершенно разные свойства и могут поддерживать условные объекты нескольких связанных классов.
Его преимущества:
Это может сделать замок более справедливым, так что поток отвечает на прерывания при ожидании блокировки, чтобы поток мог попытаться приобрести блокировку и немедленно вернуться, когда он не может приобрести блокировку или ждать некоторого периода времени, который можно приобрести и выпускать в разных заказах в разных диапазонах.
3. Что такое структура исполнителей?
Структура исполнителя вводится в Java 5 с интерфейсом java.util.concurrent.executor. Framework Executor - это структура, которая выполняет асинхронные задачи, которые выполняют вызовы политики, графики, выполняют и управляют в соответствии с набором политик.
Неограниченные потоки создания могут вызвать переполнение памяти приложения. Таким образом, создание пула потоков является лучшим решением, потому что количество потоков может быть ограничено, а количество потоков может быть переработано и повторно использовано. Использование Framework Executors может легко создать пул потоков. Прочитайте эту статью, чтобы узнать, как использовать структуру исполнителя для создания пула потоков.
4. Что такое блокирующая очередь? Как реализовать модель производителя-потребителя с помощью очередей блокировки?
Особенность java.util.concurrent.blockqueue - когда очередь пуст, операция получения или удаления элементов из очереди будет заблокирована или когда очередь будет заполнена, операция добавления элементов в очередь будет заблокирована.
Очередь блокировки не принимает нулевые значения, и когда вы пытаетесь добавить нулевые значения в очередь, она бросает NullPointerException.
Реализация блокирующих очередей безопасна для резьбы, и все методы запросов являются атомными и используют внутренние блокировки или другие формы одновременного управления.
Интерфейс BlockingQueue является частью структуры коллекций Java, которая в основном используется для реализации проблем с производителем-потребителями.
5. Что можно призвать и будущее?
Java 5 представляет java.util.concurrent.lableable интерфейс в пакете параллелистики. Он очень похож на запускаемый интерфейс, но он может вернуть объект или бросить исключение.
Коллируемый интерфейс использует Generics для определения его типа возврата. Класс исполнителей предоставляет некоторые полезные методы для выполнения задач в рамках в пуле потоков. Поскольку задача вызов параллельна, мы должны ждать результата, который он возвращается. Java.util.concurrent.future объект решает эту проблему для нас. После того, как пул потоков передает задачу, будучи, возвращается будущий объект. Используя его, мы можем узнать статус вызова и получить результат выполнения, возвращаемый вызовом. Future предоставляет метод get (), который позволяет нам ждать завершения вызова и получить результат выполнения.
6. Что такое FutureTask?
FutureTask - это базовая реализация будущего, мы можем использовать его с исполнителями для выполнения асинхронных задач. Обычно нам не нужно использовать класс FutureTask, он становится очень полезным, когда мы планируем переписать некоторые методы будущего интерфейса и сохранить оригинальную базовую реализацию. Мы можем просто унаследовать от этого и переписать необходимые методы.
7. Какова реализация одновременных контейнеров?
Все классы коллекции Java все быстро терпят неудачу, что означает, что при изменении набора и поток использует итератор для прохождения набора, метод итератора Next () будет выбросить исключение ConcurrentModificationException.
Одновременные контейнеры поддерживают одновременную обход и одновременные обновления.
Основными классами являются comparrenthashmap, copyonwritearraylist и copyonwritearrayset. Прочитайте эту статью, чтобы узнать, как избежать CondurentModificationException.
8. Что такое класс исполнителей?
Исполнители предоставляют некоторые методы инструмента для исполнителя, исполнителя, receemorsers, preduledexecutorservice, treadfactory и callyble.
Исполнители можно использовать для удобного создания пулов потоков.
На самом деле, есть еще много основных вопросов интервью Java, и вы можете систематически организовать их.
Я надеюсь, что все будут успешными в интервью!