предисловие
Потратил неделю на просмотр коллекций Java, прежде чем:
- Обзор коллекции
- Сбор списков так прост [анализ исходного кода]
- Введение в наборы карт, хеш-таблицы и красно-черные деревья
- HashMap такой простой [анализ исходного кода]
- LinkedHashMap настолько прост [анализ исходного кода]
- TreeMap настолько прост [анализ исходного кода]
- ConcurrentHashMap основан на анализе исходного кода JDK1.8.
- Собирать наборы так просто!
- Резюме коллекции Java [вопросы для интервью + карта мозга], чтобы уловить все точки знаний!
Прежде чем писать статью, я прочитал главу о параллелизме в «Java Core Technology Volume 1» и предыдущую часть «Java Concurrent Programming Practice», а также просмотрел написанные ранее заметки. С сегодняшнего дня я войду в точку знаний о многопоточности~
Я очень серьезно относился к изучению основ многопоточности, когда раньше изучал основы Java, но я не стал повторять это позже, и со временем почти забыл об этом. Я никогда не использовал многопоточность в обучении. JavaWeb (Сделал что-то слишком водянистое...).
Так как на эту часть собеседования приходится большая доля, а изучение многопоточности тоже очень поможет мне в будущем совершенствования (я так думаю).
На самом деле, я также эквивалентен изучению многопоточности с нуля.Если в статье есть ошибки, пожалуйста, добавьте больше и не стесняйтесь исправлять меня в области комментариев~~
Во-первых, первое понимание многопоточности
1.1 Знакомство с процессом
Говоря о тредах, я должен снова упомянуть процесс ~
Вероятно, мы очень хорошо знаем этот процесс.Откройте диспетчер задач в Windows, и вы обнаружите, что все программы, которые мы запускаем в операционной системе, являются процессами:
Определение процесса:
процессодно выполнение программы, процесс - это то, что происходит, когда программа и ее данные последовательно выполняются на процессоре.Мероприятия, процесс — это процесс, в котором программа с независимыми функциями работает с набором данных, это системный ресурсНезависимая единица распределения и планирования
- Процесс — это независимая единица распределения ресурсов и планирования в системе. Каждый процесс имеет собственное пространство памяти и системные ресурсы.
1.2 Вернуться к теме
Тогда в системе есть понятие процесса, и процесс уже может выделять и планировать ресурсы.Зачем даже нить??
Чтобы программа выполнялась одновременно, система должна выполнить следующий ряд операций:
- (1)создать процесс, когда система создает процесс, она должна выделить для него все необходимые ресурсы, кроме процессора, такие как пространство памяти, устройства ввода/вывода, и создать соответствующие печатные платы;
- (2)отменить процесс, когда система отменяет процесс, она должна сначала выполнить операцию рециркуляции на занятых им ресурсах, а затем отменить печатную плату;
- (3)переключатель процессаПри переключении процесса вам необходимо сохранить среду ЦП текущего процесса, установить среду ЦП вновь выбранного процесса, поэтому много машинного времени процесса.
Можно видеть, что когда процесс реализует планирование, диспетчеризацию и переключение процессов в многопроцессорной среде,нужно тратить много времени и места наверху
Внедрение потоков в основном предназначено для повышения эффективности выполнения системы, сокращения времени простоя процессора и времени переключения планирования, а также облегчения управления системой. ** Улучшение параллелизма в ОС
- Проще говоря:многопроцессорность процессовОчень интенсивно использует ЦП, и мыПредставляем поток как базовую единицу планирования и диспетчеризации(Заменяет некоторые основные функции процесса **[Планирование]**).
Так где треды? ? Например:
Это:Несколько задач могут выполняться в одном процессе, и я вижу, что каждая задача представляет собой поток..
- так:Процесс имеет один или несколько потоков!
1.3 Процессы и потоки
Итак, мы можем сделать вывод:
- процесс как ресурсраспространятьосновная единица
- поток как ресурсрасписаниеосновная единицаисполнительная единица программы, путь выполнения(Однопоточный: один путь выполнения, многопоточный: несколько путей выполнения). Это самая основная единица программы, использующая ЦП.
нить имеет3 основных состояния:
- выполнить, готово, блокировка
нить имеет5 основных операций:
- Вилка, Блокировка, Активация, Отправка, Конец
Свойства потока:
- 1) Легкие сущности;
- 2) Базовый блок самостоятельного планирования и назначения;
- 3) могут выполняться одновременно;
- 4) Общие ресурсы процесса.
нить имеетдва основных типа:
-
- Поток уровня пользователя: Весь процесс управления выполняется пользовательской программой,Ядро в операционной системе только управляет процессом.
-
- поток системного уровня(потоки основного уровня):Управляется ядром операционной системы. Ядро операционной системы предоставляет соответствующие системные вызовы и API интерфейса прикладных программ для прикладных программ, так что пользовательские программы могут создавать, выполнять и отменять потоки.
Стоит отметить, что наличие многопоточности не улучшает скорость выполнения программы. фактическизаключается в увеличении использования приложения, выполнение программы фактически находится вЗахватить ресурсы процессора, право выполнения ЦП. Несколько процессов захватывают этот ресурс,И если у одного из процессов больше путей выполнения, там будетболее высокий шансЗахватите право выполнения процессора
1.4 Параллелизм и параллелизм
параллельно:
- Параллелизм означаетв то же времяПроисходят два или более события.
- в параллелиразныеНесколько событий на объекте
Параллелизм:
- Параллелизм означаетв тот же промежуток времениПроисходят два или более события.
- Параллелизм находится втот же объектнесколько событий на
Видно, что параллелизм для процессов,Параллелизм для потоков.
1.5 Java реализует многопоточность
Выше сказано много основ, понять слова. Вернемся к Java и посмотрим, как Java реализует многопоточность~
Java реализует многопоточность с помощью класса Thread, давайте посмотримЛучший комментарий для класса Thread:
Из верхнего комментария выше мы можем обнаружить, что создание многопоточностидваметод:
- Наследовать Thread и переопределить метод запуска
- Реализуйте интерфейс Runnable и переопределите метод запуска.
1.5.1 Наследовать поток и переопределить метод запуска
Создайте класс, наследуйте Thread и переопределите метод запуска.
public class MyThread extends Thread {
@Override
public void run() {
for (int x = 0; x < 200; x++) {
System.out.println(x);
}
}
}
Давайте вызовем тест, чтобы увидеть:
public class MyThreadDemo {
public static void main(String[] args) {
// 创建两个线程对象
MyThread my1 = new MyThread();
MyThread my2 = new MyThread();
my1.start();
my2.start();
}
}
1.5.2 Реализовать интерфейс Runnable и переписать метод запуска
Реализуйте интерфейс Runnable и переопределите метод запуска.
public class MyRunnable implements Runnable {
@Override
public void run() {
for (int x = 0; x < 100; x++) {
System.out.println(x);
}
}
}
Давайте вызовем тест, чтобы увидеть:
public class MyRunnableDemo {
public static void main(String[] args) {
// 创建MyRunnable类的对象
MyRunnable my = new MyRunnable();
Thread t1 = new Thread(my);
Thread t2 = new Thread(my);
t1.start();
t2.start();
}
}
Результат все тот же, что и вышеТакой жеДа, я не буду размещать здесь фотографии~~~
1.6 Детали, на которые необходимо обратить внимание при реализации многопоточности в Java
Не надоrun()
иstart()
запутался~
Разница между методами run() и start():
-
run()
:ПростоПоток выполнения пакетов кода, прямой вызов — это обычный метод -
start()
:Во-первыхпоток запущен,после этогоМетод run() потока вызывается jvm.
Является ли запуск виртуальной машины JVM однопоточным или многопоточным?
- является многопоточным. Запустится не только основной поток, но и хотя бы поток сборки мусора, иначе кто поможет вам вернуть неиспользуемую память~
Итак, поскольку существует два способа реализации многопоточности, мыкакой использовать? ? ?
Обычно мы используем для реализации интерфейса Runnable
- Ограничения одиночного наследования в java можно избежать
- должно быть одновременноРазделение запущенных задач и запущенных механизмов, поэтому мы решили реализовать интерфейс Runnable таким образом!
2. Резюме
В этой статье в основном объясняется, что такое потоки, и понимание основ потоков полезно для нашего будущего обучения. В основном здесьлегкий вход
Читая комментарии вверху, мы обнаружили, что есть такие слова, как "приоритет" и "фоновый поток". Эта статья не объясняет, что они собой представляют~ Итак, следующая статьяОсновное объяснение - API Thread~Пожалуйста, ждите этого~
Использование потоков на самом деле сделает наши данные небезопасными, и даже программа не сможет работать. Эти проблемы будут объяснены позже~
Когда я раньше изучал операционную систему, я также сделал небольшую заметку на основе книги «Компьютерная операционная система — Тан Сяодань», все из которых относительнопростое знание. Может быть, это поможет тебе~
- Операционная система, часть 1 [Введение]
- Операционная система, часть 2 [Управление процессами]
- Операционная система, часть 3 [Тема]
- Операционная система Глава 4 [Планирование процессора]
- Операционная система, часть 5 [Тупик]
- Операционная система Глава 6 [Управление памятью]
- Операционная система Глава 7 [Управление устройствами]
Использованная литература:
- "Основная технология Java, том 1"
- «Практика параллельного программирования на Java»
- «Компьютерная операционная система — Тан Сяодань»
Если в статье есть какие-либо ошибки, пожалуйста, поправьте меня, и мы сможем общаться друг с другом. Учащиеся, привыкшие читать технические статьи в WeChat и желающие получить больше ресурсов по Java, могутОбратите внимание на публичный аккаунт WeChat: Java3y.
Проект с открытым исходным кодом, охватывающий все точки знаний о бэкэнде Java (уже 6 тысяч звезд):GitHub.com/Zhongf UC очень…
если ты хочешьв реальном времениЕсли вы обратите внимание на мои обновленные статьи и галантерейные товары, которыми я делюсь, поищите в WeChat.Java3y.
Содержимое PDF-документоввсе вручную, если вы ничего не понимаете, вы можете напрямуюспросите меня(В официальном аккаунте есть мои контактные данные).