предисловие
Вчера было написано:
Если вы не читали, то прочтите сначала~
Прежде чем писать статью, я прочитал главу о параллелизме в «Java Core Technology Volume 1» и предыдущую часть «Java Concurrent Programming Practice», а также просмотрел написанные ранее заметки. С сегодняшнего дня я войду в точку знаний о многопоточности~
На самом деле, я также эквивалентен изучению многопоточности с нуля.Если в статье есть ошибки, пожалуйста, добавьте больше и не стесняйтесь исправлять меня в области комментариев~~
1. API класса потока потока
Заявление о том, что в этой статье используется JDK1.8
Реализация многопоточной резьбы существенно управляется классом потока. Давайте посмотрим на класс потоков.важные точки знаний. Класс Thread очень большой, и посмотреть его целиком невозможно, толькоПосмотрите на некоторые распространенные и важные методы.
Мы уже разобрали комментарии вверху, если не знаете, можете перейти по ссылке:Вы можете войти в дверь за три минуты с многопоточностью!
1.1 Установите имя потока
Мы используем несколько потоков, когда вы хотите увидеть имя темы, очень просто, вызовThread.currentThread().getName()
Вот и все.
Если нет настройки, что делать, мы обнаружим, что имя потока выглядит так:Основной поток называется main, остальные потоки — Thread-x.
Здесь я покажу вам, как он называется:
nextThreadNum()
Реализация метода такова:
На основе такой переменной -->Количество инициализаций потока
Укажите, чтобы увидеть, как можно определить метод инициализации:
Видя здесь, если мы хотим дать потоку имя, это также очень просто.Thread предоставляет нам конструктор!
Давайте проверим это:
- Реализован способ Runnable для достижения многопоточности:
public class MyThread implements Runnable {
@Override
public void run() {
// 打印出当前线程的名字
System.out.println(Thread.currentThread().getName());
}
}
контрольная работа:
public class MyThreadDemo {
public static void main(String[] args) {
MyThread myThread = new MyThread();
//带参构造方法给线程起名字
Thread thread1 = new Thread(myThread, "关注公众号Java3y");
Thread thread2 = new Thread(myThread, "qq群:742919422");
thread1.start();
thread2.start();
// 打印当前线程的名字
System.out.println(Thread.currentThread().getName());
}
}
результат:
Конечно, мы также можемsetName(String name)
способ изменить имя потока. Давайте посмотрим на реализацию метода;
Проверьте, есть ли у вас разрешение на изменение:
Что касается атрибута статуса threadStatus,Кажется, не нашел, где он собирается его изменить.:
1.2 поток демона
Тема демона естьдля других потоков
- Поток сборки мусора — это поток демона.~
Поток демона имеетФункции:
- Когда другие пользовательские потоки закончат выполнение, виртуальная машина завершит работу, а поток демона будет остановлен.
- Другими словами: оберегающая нить как единое целоеТема обслуживания, нет необходимости продолжать работать без сервисного объектаохватывать
О чем следует помнить при использовании потоков
-
до начала потокаУстановить как поток демона
setDaemon(boolean on)
- использовать поток демонаНе получать доступ к общим ресурсам(базы данных, файлы и т.д.), так как он мог зависнуть в любой момент.
- Новый поток, созданный в потоке демона, также является потоком демона.
Протестируйте волну:
public class MyThreadDemo {
public static void main(String[] args) {
MyThread myThread = new MyThread();
//带参构造方法给线程起名字
Thread thread1 = new Thread(myThread, "关注公众号Java3y");
Thread thread2 = new Thread(myThread, "qq群:742919422");
// 设置为守护线程
thread2.setDaemon(true);
thread1.start();
thread2.start();
System.out.println(Thread.currentThread().getName());
}
}
Приведенный выше код можно запускать несколько раз (учащиеся с хорошей производительностью компьютера могут не иметь возможности протестировать его):После выполнения потока 1 и основного потока наш поток демона выполняться не будет.~
Обоснование: Вот почему мыперед стартомНастройте поток демона.
1.3 Приоритетные потоки
Высокий приоритет потока означает только то, что потокВысокая вероятность получения кванта процессорного времени, но это неопределенные факторы!
Приоритет потокасильно зависит от операционной системы, Windows и Linux разные (под Linux приоритет может быть проигнорирован)~
Как видите, приоритет, предоставляемый Java, по умолчанию равен 5, самый низкий — 1, а самый высокий — 10:
выполнить:
setPriority0
Является локальным (Navite) методом:
private native void setPriority0(int newPriority);
1.4 жизненный цикл потока
В предыдущем введении также упоминалось, что поток потока имеет 3 основных состояния: выполнение, готовность, блокировка.
В Java у нас есть эта диаграмма, и многие методы в ThreadИспользуется для переключения состояния потокаДа, эта часть является точкой!
На самом деле приведенная выше картина не является достаточно полной.пропускатьЧто-то упало. Я нарисую новый, когда объясню состояние потока позже~
Далее объясняются методы, связанные с жизненным циклом потока.
1.4.1 метод сна
Вызов метода сна войдет в состояние ожидания времени, и когда время истечет,Переход в состояние готовности вместо состояния выполнения!
Поэтому нашу схему можно дополнить следующим образом:
1.4.2 Метод доходности
Вызов метода yield сначалаРазрешить выполнение другого потока,ноНе уверен, что действительно сдаюсь
- значение:Я свободен, если можно, пусть казнит первым
Поэтому нашу схему можно дополнить следующим образом:
1.4.3 метод соединения
Вызовите метод соединения, подождитенитьвоплощать в жизньВыполнение других потоков после завершения~
Давайте зайдем и посмотримБетонная реализация:
Метод ожидания определен для объекта, это собственный метод, поэтому его нельзя увидеть:
waitПо сути, это тоже своего рода **временное ожидание (если есть параметр времени)**! , поэтому мы можем дополнить наш график:
1.4.3метод прерывания
Прерывание потока имело метод остановки в предыдущих версиях, но он стал устаревшим. теперь имеетБез задержки принудительного потокаСпособ!
Поскольку метод остановки позволяетПоток A завершает другой поток B
- Завершенный поток B немедленно освобождает блокировку, что можетОбъект находится в несогласованном состоянии.
- Поток A не знает, когда поток B может быть завершен, если поток B все еще обрабатывает текущую фазу вычислений, поток A вызывает метод остановки, чтобы завершить поток B, тогда это очень невинно~
В общем, метод Stop слишком грубый и небезопасный, поэтому он считается устаревшим.
Обычно мы используем прерывание длязапрос на завершение треда~
- Примечание: прерываниедействительно не остановитсяПоток, который просто сигнализирует потоку о том, что он должен закончиться (очень важно понимать!)
- Другими словами: дизайнеры Java на самом делеХотите, чтобы поток завершился сам, через вышеуказанноеСигнал, вы можете определить, каким бизнесом заниматься.
- В частности, прерывать или продолжать работу следуетобрабатывается самим уведомленным потоком
Thread t1 = new Thread( new Runnable(){
public void run(){
// 若未发生中断,就正常执行任务
while(!Thread.currentThread.isInterrupted()){
// 正常任务代码……
}
// 中断的处理代码……
doSomething();
}
} ).start();
Опять же: вызов прерывания()Не завершать текущий поток по-настоящему, просто установив флаг прерывания. Этот флаг прерывания может быть использован для того, чтобы мы могли судитьчто делать, когда! когда прерыватьНам решать,Это может бытьБезопасно завершите поток!
Давайте посмотрим, что говорит исходный код:
Давайте посмотрим, какое исключение было выбрано только что:
так:Метод прерывания никак не повлияет на состояние потока, он только установит бит флага.
прерывание прерывания потока и другиеДва метода (проверить, не прерван ли поток):
- Статический метод прерван () -->сбросит флаг прерывания
- Метод экземпляра isInterrupted() -->Не сбрасывает флаги прерывания
Как упоминалось выше, если блокирующий поток вызывает метод interrupt(), онВыбросьте исключение, установите флаг в false, и поток выйдет из блокировки.из. Давайте проверим волну:
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
Main main = new Main();
// 创建线程并启动
Thread t = new Thread(main.runnable);
System.out.println("This is main ");
t.start();
try {
// 在 main线程睡个3秒钟
Thread.sleep(3000);
} catch (InterruptedException e) {
System.out.println("In main");
e.printStackTrace();
}
// 设置中断
t.interrupt();
}
Runnable runnable = () -> {
int i = 0;
try {
while (i < 1000) {
// 睡个半秒钟我们再执行
Thread.sleep(500);
System.out.println(i++);
}
} catch (InterruptedException e) {
// 判断该阻塞线程是否还在
System.out.println(Thread.currentThread().isAlive());
// 判断该线程的中断标志位状态
System.out.println(Thread.currentThread().isInterrupted());
System.out.println("In Runnable");
e.printStackTrace();
}
};
}
результат:
Далее мы анализируем егоПроцесс реализацииНа что это похоже:
18 апреля 2018 г. 20:32:15 (вау, этот метод реально меня очень долго поглощает).....Спасибо @startde trace за совет~~~~~
Эта ссылка:
- ООО, ООО на .cn blog .com / i - Нет ответа / страха / 641 ...
- Wooooooo.cn blog on.com/carman Lone ...
- Ууху. Call.com/question/41…
- Ууху. Call.com/question/41…
2. Резюме
Можно обнаружить, что наш график еще не завершен ~ В последующих статьях будет продолжать использоваться приведенный выше график, когда дело доходит до синхронизации. в потокеВажны те методы, которые могут переключать состояние потока, и понимание того, что на самом деле означает прерывание.
Использование потоков приведет к тому, что наши данные будут небезопасными, и даже программа не сможет работать. Эти проблемы будут объяснены позже~
Когда я раньше изучал операционную систему, я также сделал небольшую заметку на основе книги «Компьютерная операционная система — Тан Сяодань», все из которых относительнопростое знание. Может всем поможет
- Операционная система, часть 1 [Введение]
- Операционная система, часть 2 [Управление процессами]
- Операционная система Часть 3 [Тема]
- Операционная система Глава 4 [Планирование процессора]
- Операционная система, часть 5 [Тупик]
- Операционная система Глава 6 [Управление памятью]
- Операционная система Глава 7 [Управление устройствами]
Использованная литература:
- "Основная технология Java, том 1"
- «Практика параллельного программирования на Java»
- «Компьютерная операционная система — Тан Сяодань»
Если в статье есть какие-либо ошибки, пожалуйста, поправьте меня, и мы сможем общаться друг с другом. Учащиеся, привыкшие читать технические статьи в WeChat и желающие получить больше ресурсов по Java, могутОбратите внимание на публичный аккаунт WeChat: Java3y.
Проект с открытым исходным кодом, охватывающий все точки знаний о бэкэнде Java (уже 6 тысяч звезд):GitHub.com/Zhongf UC очень…
если ты хочешьв реальном времениЕсли вы обратите внимание на мои обновленные статьи и галантерейные товары, которыми я делюсь, поищите в WeChat.Java3y.
Содержимое PDF-документоввсе вручную, если вы ничего не понимаете, вы можете напрямуюспросите меня(В официальном аккаунте есть мои контактные данные).