1. Концепция процесса и потока
(1) В традиционных операционных системах программы не могут работать самостоятельно, а в качестве основных единиц распределения ресурсов и независимой работы - все это процессы.
В системах без ОС метод выполнения программ является последовательное выполнение, то есть одна программа должна быть выполнена, прежде чем можно выполнить другая программа; В многопрограммной среде разрешено выполнять несколько программ. Существуют значительные различия между двумя способами выполнения программы. Именно эта характеристика одновременного выполнения программ приводит к внедрению концепции процессов в операционной системе.
Поскольку люди предложили концепцию процессов в 1960 -х годах, процессы всегда использовались в ОС в качестве базовой единицы, которая может иметь ресурсы и работать независимо. До середины 1980-х годов люди предложили базовую единицу, которая может работать независимо, потоки, которые меньше процессов, чтобы попытаться использовать его для увеличения степени одновременного выполнения программ в системе, что еще больше увеличивает пропускную способность системы. Особенно после входа в 1990-е годы многопроцессорные системы быстро развивались. Поток может лучше улучшить параллельное выполнение программ, чем процессы, и полностью оказывать преимущества мультипроцессоров. Таким образом, в последние годы были введены темы в многопроцессорной ОС, запущенной в последние годы для повышения производительности ОС.
«Вышеуказанное выдержек из « Компьютерная операционная система - отредактирована Tang Xiaodan и другими - издание 3 » (адрес загрузки)
(2) Следующий рисунок - это объяснение пользователей Zhihu:
Благодаря вышеупомянутому общему пониманию мы в основном знаем, что делают потоки и процессы. Итак, давайте обобщу концепцию процессов и потоков ниже:
(3) Процесс - это работающая деятельность программы в компьютере о определенном наборе данных, это основная единица распределения и планирования ресурсов системы, и он является основой структуры операционной системы. В ранних процессах компьютерных структур процессы были основными объектами выполнения программ; В современных компьютерных структурах, ориентированных на резьбу, процессы были контейнерами с потоками. Программа - это описание инструкций, данных и ее организационной формы, а процесс является объектом программы.
(4) потоки, иногда называемые легкими процессами (LWP), являются наименьшей единицей потока выполнения программы. Потоки представляют собой единый последовательный процесс управления в программе. Относительно независимой и запланированной единицей выполнения в процессе является базовая единица независимого планирования и отправки ЦП в системе, которая относится к единице планирования запуска программ. Запуск нескольких потоков одновременно в одной программе для выполнения различной работы, называемой многопоточной.
(5) Взаимосвязь между процессом и потоком:
2. Java реализует метод многопоточного чтения
(1) Наследственные потока и переписать метод run ()
открытый класс Mythread Extends Thread {@Override public void run () {while (true) {System.out.println (this.currentThread (). getName ()); }} public static void main (string [] args) {mythread thread = new mythread (); Thread.Start (); // правильный способ запуска потока}}Результат вывода:
Thread-0thread-0thread-0 ...
Кроме того, вам необходимо понять, что метод start () является методом start () вместо метода run (). Если используется метод run (), то это обычный метод для выполнения.
(2) Реализуйте выполняемый интерфейс
открытый класс MyRunnable Reflames Runnable {@Override public void run () {System.out.println ("123"); } public static void main (string [] args) {myrunnable myrunnable = new myrunnable (); Thread Think = новый поток (Myrunnable, "T1"); Thread.Start (); }}3. Безопасность нити
Концепция безопасности потока: когда несколько потоков получают доступ к определенному классу (объекту или методу), класс всегда может показать правильное поведение, а затем этот класс (объект или метод) безопасен.
Безопасность потока при доступе к мультипотчикам, используется механизм блокировки. Когда поток обращается к определенным данным класса, он защищен. Другие потоки не могут получить к нему доступ, пока поток не закончит его чтение, а другие потоки не могут его использовать. Там не будет никакого несоответствия данных или загрязнения данных. Поток небезопасно, что означает, что они не обеспечивают защиту доступа к данным. Вполне возможно, что несколько потоков могут изменить данные один за другим, в результате чего результирующие данные будут грязными. Общий механизм блокировки здесь: синхронизированный
4. Синхронизированный модификатор
(1) Синхронизировано: вы можете добавить блокировки в любой объект и метод, а заблокированный код называется «областью мутекс» или «критической области».
(2) ** Не используйте ** Синхронизированный экземпляр (код A):
public class MyThread extends Thread {private int count = 5;@Override public void run() {count--;System.out.println(this.currentThread().getName() + " count:" + count);}public static void main(String[] args) {MyThread myThread = new MyThread();Thread thread1 = new Thread(myThread, "thread1");Thread thread2 = new Thread (MyThread, "Thread2"); Thread Thread3 = новый поток (mythread, "thread3"); Thread Thread4 = новый поток (Mythread, "Thread4"); Thread Think5 = New Thread (Mythread, "Thread5"); Thread1.start (); Thread2.start (); Thread.start (); ThreadStart (); ThreadStart ();Один результат вывода заключается в следующем:
Thread3 Count: 2thread4 Счет: 1thread1 Счет: 2thread2 Счет: 3thread5 Счет: 0
Можно видеть, что приведенный выше результат неверен, потому что несколько потоков управляют методом run () одновременно и изменяют количество, что, в свою очередь, вызывает ошибку.
(3) ** Используйте ** Синхронизированный экземпляр (код B):
открытый класс Mythread Extends Thread {private int count = 5; @Override public synchronized void run () {count--; System.out.println (this.currentthread (). GetName () + "count:" + count); } public static void main (string [] args) {mythread mythread = new mythread (); Thread Think1 = новый поток (Mythread, "Thread1"); Thread Think2 = новый поток (Mythread, "Thread2"); Thread Think3 = новый поток (Mythread, "Thread3"); Thread Think4 = новый поток (Mythread, "Thread4"); Thread Think5 = новый поток (Mythread, "Thread5"); Thread1.start (); Thread2.start (); Thread3.start (); Thread4.start (); Thread5.start (); }}Результат вывода:
Thread1 Count: 4thread2 Count: 3thread3 Подсчет: 2thread5 Count: 1thread4 Count: 0
Можно видеть, что разница между кодом A и кодом B заключается в том, что синхронизированная модификация добавляется в метод run ().
Описание следующим образом:
Когда несколько потоков получают доступ к методу запуска Mythread, если используется синхронизированная модификация, многопоточная перегрузка будет обрабатываться в очереди (очередь здесь определяется в соответствии с порядком распределения ЦП). Если поток хочет выполнить код в методе синхронизированной модификации, он сначала пытается получить блокировку. Если он получает блокировку, выполняет содержимое корпуса синхронизированного кода. Если он не может получить блокировку, поток продолжит пытаться получить блокировку, пока он не получит его. Более того, несколько потоков конкурируют за блокировку одновременно, что означает, что конкуренция за блокировку будет происходить.
5. У объекта есть замок! Несколько потоков и несколько замков!
Что есть, у одного объекта есть одна блокировка, несколько потоков имеют несколько блокировки! Во -первых, давайте посмотрим на пример кода ниже (код C):
открытый класс MultiThread {private int num = 200; public Synchronized void printnum (строка ThreadName, String Tag) {if (Tag.equals ("a")) {num = num - 100; System.out.println (threadname + "Tag a, установить num over!"); } else {num = num - 200; System.out.println (threadname + "Tag" + Tag + ", num =" + num); } public static void main (string [] args) бросает прерывание {final MultiThread MultiThread1 = new MultiThread (); окончательный многопоточный multiThread2 = new -multiThread (); новый поток (new Runnable () {public void run () {multiThread1.printnum ("thread1", "a");}}). start (); Thread.sleep (5000); System.out.println («Подождите 5 секунд, чтобы убедиться, что Thread1 был выполнен!»); новый поток (new Runnable () {public void run () {multiThread2.printnum ("thread2", "b");}}). start (); }}Результат вывода:
Thread1 Tag A, установите Num Over! Thread1 Tag A, num = 100wait 5 секунд, чтобы убедиться, что Thread1 был выполнен! Thread2 Tag B, установите num Over! Thread2 Tag b, num = 0
Видно, что есть два объекта: MultiThread1 и MultiThread2. Если несколько объектов используют одну и ту же блокировку, результат приведенного выше выполнения должен быть: Thread2 Tag B, num = -100. Следовательно, каждый объект имеет блокировку этого объекта.
Замок, полученные с помощью ключевых слов, представляют собой блокировки объектов, а не обрабатывают кусок кода или метода как блокировки. Следовательно, в приведенном выше примере кода C, который поток сначала выполняет метод синхронизированного ключевого слова, поток удерживает блокировку объекта, к которому принадлежит метод. Поток получает два разных замка двух разных объектов, и они дополняют друг друга.
Таким образом, в обычных сценариях должна быть ситуация, когда все объекты будут работать по количеству переменных, так как это реализовать? Это очень просто добавить статическое. Мы знаем, что все объекты в этом классе имеют одинаковую ссылку, независимо от того, сколько объектов создано, вызов - это метод, а код выглядит следующим образом (код D):
открытый класс MultiThread {private Static int num = 200; public static synchronized void printnum (String Threadname, String Tag) {if (Tag.equals ("a")) {num = num - 100; System.out.println (threadname + "Tag a, установить num over!"); } else {num = num - 200; System.out.println (ThreadName + "Tag B, установите num over!"); } System.out.println (threadname + "Tag" + Tag + ", num =" + num); } public static void main (string [] args) бросает прерывание {final MultiThread MultiThread1 = new MultiThread (); окончательный многопоточный multiThread2 = new -multiThread (); новый поток (new Runnable () {public void run () {multiThread1.printnum ("thread1", "a");}}). start (); Thread.sleep (5000); System.out.println («Подождите 5 секунд, чтобы убедиться, что Thread1 был выполнен!»); новый поток (new Runnable () {public void run () {multiThread2.printnum ("thread2", "b");}}). start (); }}Результат вывода:
Thread1 Tag A, установите Num Over! Thread1 Tag A, num = 100wait 5 секунд, чтобы убедиться, что Thread1 был выполнен! Thread2 Tag B, установите num Over! Thread2 Tag B, num = -100
Можно видеть, что добавление статической модификации к переменным и методам может реализовать сценарии, которые нам нужны. Это также показывает, что для нестатических методов статической модификации или переменных, заблокированный объект.
6. Синхронные и асинхронные блокировки объекта
(1) Синхронизированный
Концепция синхронизации делятся. Нам нужно знать, что слово «совместное использование» не является общим ресурсом, нет необходимости синхронизировать, то есть нет необходимости блокировать его;
Цель синхронизации - обеспечить безопасность потоков. Фактически, для безопасности потока необходимо выполнить две самые основные характеристики: атомность и видимость;
(2) Асинхронизирован: асинхронизирован
Концепция асинхронности заключается в независимости, без каких -либо ограничений между собой, и между ними нет никаких отношений.
(3) Пример кода:
открытый класс myObject {public void method () {System.out.println (thread.currentThread (). getName ()); } public static void main (string [] args) {final myObject myObject = new myObject (); Поток T1 = новый поток (new Runnable () {public void run () {myObject.method ();}}, "t1"); Поток t2 = new Thread (new Runnable () {public void run () {myObject.method ();}}, "t2"); t1.start (); t2.start (); }}В приведенном выше коде метод () является асинхронным методом.
Суммировать
Выше приведено все содержание этой статьи о начальном решении концепции потока, процесса и синхронизации в мультипотчике Java. Я надеюсь, что это будет полезно для всех. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение и укажите его, и редактор ответит на всех вовремя.