multithreading java tutorial with examples
Този урок обяснява всичко за многопоточност в Java, внедряване на паралелност, жизнения цикъл на нишка, пример за клас на нишка, нишка с помощта на изпълним интерфейс:
Съвпадението в компютърния свят е способността на системата (било то приложение, компютър или език за програмиране) да изпълнява паралелно няколко екземпляра на програма или приложение.
Чрез едновременно изпълнение на екземпляри или програми ние гарантираме висока производителност и по-висока производителност, тъй като можем да използваме неизползваните ресурси като хардуер на операционната система и т.н. Например, ако една система има няколко процесора, тогава приложението може да ги използва ефективно и да увеличи производителността.
=> Посетете тук за ексклузивната серия уроци за обучение по Java.
Какво ще научите:
- Какво представлява многопоточността в Java
- Какво представлява нишката в Java
- Заключение
Какво представлява многопоточността в Java
В Java нишките могат да се разглеждат като гръбнак на едновременността. Нишката е изпълним, лек блок, който има достъп до споделени ресурси, както и до собствен стек повиквания.
Приложението на Java е един процес и в това приложение можем да имаме множество нишки за постигане на паралелност.
Знаем, че приложение, работещо в системата, може да има множество екземпляри и те обикновено се наричат мултидок приложения. Тези екземпляри на приложения се наричат процеси. На всеки от тези процеси се присвоява изпълнителна единица, известна като нишка.
В зависимост от операционната система и изискванията на приложението, на процеса може да бъде присвоена единична или множество нишки. Когато на процеса на кандидатстване са зададени множество нишки, тогава трябва да изпълним тези множество нишки едновременно.
' Тази техника за изпълнение или изпълнение на множество нишки едновременно или едновременно е известна като многопоточност . '
Многопоточността просто означава, че имаме повече от една нишка, изпълняваща се в едно и също приложение.
Езикът за програмиране Java има вградена поддръжка за многопоточност.
Многопоточността е изобразена в горната схема. Както е показано, има множество нишки, които се изпълняват едновременно в приложението.
Например, настолно приложение, осигуряващо функционалност като редактиране, печат и т.н., е многонишко приложение. В това приложение, тъй като отпечатването е фонов процес, можем да извършваме редактиране на документи и отпечатване на документи едновременно, като присвоим тези функции на две различни нишки.
Нишките в многонишковите приложения се изпълняват успоредно една на друга по едновременен начин. По този начин многопоточността също е част от едновременността в Java. Имайте предвид, че въпреки че има множество нишки, те споделят областта на паметта, като по този начин спестяват на паметта. Също така, нишките могат лесно да превключват контекста за нула време.
Многопоточността е главно полезна, тъй като осигурява едновременно изпълнение на две или повече части на приложение. Това позволява на приложението да използва процесорното време до своя максимум, а времето на празен ход е сведено до минимум.
По-долу са някои от термините, които трябва да знаем във връзка с многопоточната среда, тъй като те се използват често.
Многозадачност: При многозадачност едновременно се изпълняват повече от една задача.
Многопоточност: Многопоточността, както вече споменахме, е процес на изпълнение на множество нишки едновременно.
най-добрите сайтове за гледане на дублирано аниме
Мултипроцесинг: При многопроцесорната обработка се изпълняват едновременно повече от един процес. Подобно на многозадачност, но тук участват повече от един процесор.
Паралелна обработка: Паралелната обработка е техника, при която множество процесори работят едновременно в компютърна система.
След като обсъдихме многопоточност, възниква въпросът защо изобщо се нуждаем от многопоточност?
Предимства на многопоточността
Многопоточността има различни предимства, които подпомагат ефективното програмиране.
По-долу ще стане ясно.
# 1) Ефективно използване на единични CPU системи
Когато в системата има само един процесор, с една нишка, времето на процесора се губи. Когато нишката е заета с използване на други ресурси като IO, процесорът е неактивен. Можем да подобрим това и да използваме по-добре процесора, като имаме многонишкови приложения.
Чрез използване на многопоточност, ако едната нишка е направена с процесор, тогава другата нишка може да я използва. С множество нишки времето на празен ход на процесора ще бъде значително намалено.
# 2) Ефективно използване на множество CPU системи
Подобно на единичните процесори, дори и при системи с множество процесори, многонишковите приложения могат да използват ефективно множество процесори.
# 3) Подобрено потребителско изживяване по отношение на отзивчивостта и справедливостта
Отзивчивостта на системата се подобрява с многонишкови приложения. Ние не изпитваме ‘GUI виси’ когато имаме множество нишки, изпълняващи различни задачи в приложението и потребителите не трябва да чакат дълго време, за да получат отговор на своите заявки.
По същия начин потребителите са правилно услуги в многонишкови системи.
Как да приложим едновременност в Java
Първият клас, с който можем да реализираме едновременност в Java, е java.lang.Thred клас. Този клас Thread формира основата на едновременността в Java.
Имаме също java.lang.Изпълним интерфейс, който може да бъде реализиран от клас Java за абстрахиране на поведението на нишката. За напреднала разработка на приложения можем да се възползваме от java.util.concurrent пакет, наличен от Java 1.5.
Продължавайки напред, ще обсъдим подробно съвпадението в Java. Нека обсъдим и разберем концепцията за нишките в Java в този урок. В следващите ни уроци за многопоточност ще разгледаме различни концепции за многопоточност и паралелност.
Какво представлява нишката в Java
Една нишка може да бъде определена като най-малката и лека единица за обработка. В Java нишките се използват в програми, използващи клас „Thread“.
Нишките Java са два вида:
# 1) Потребителска нишка: потребителска нишка се създава при първото стартиране на приложението. Тогава можем да създадем колкото се може повече потребителска и демонова нишка.
# 2) Daemon нишка: демонови нишки се използват главно във фонов режим и се използват за задачи като почистване на приложението и т.н.
Конците намаляват разходите за поддръжка на приложението. Освен това намалява режийните разходи за приложението.
Пример за единична нишка е показан по-долу:
public class Main{ public static void main (String [] args){ System.out.println('This is a thread'); } }
Горната програма ще покаже „Това е нишка“, тъй като при стартиране на приложението се създава потребителска нишка. В горната програма основната функция е началната точка на приложението и тя създава потребителска нишка.
Жизненият цикъл на една нишка
Следващата диаграма изобразява жизнения цикъл на нишка в Java.
Както е показано на горната диаграма, една нишка в Java има следните състояния:
# 1) Ново: Първоначално нишката, току-що създадена от клас нишка, има „ново“ състояние. Тепърва ще започне. Тази нишка също се нарича ‘Родена нишка’ .
# 2) Изпълним: В това състояние екземплярът на нишка се извиква с помощта на метода ‘Старт’ .
# 3) Изпълнение: Извиква се методът за стартиране на екземпляра на нишката и нишката започва изпълнението. Това е текущото състояние. Предимно планировчикът планира и управлява нишките.
# 4) Блокиран: В приложението има множество нишки. Тези нишки трябва да чакат друга, тъй като изпълнението им трябва да бъде синхронизирано.
# 5) Прекратено: След като процесът на изпълнение на нишката приключи, нишката се прекратява или нейното изпълнение се спира.
Така първо се създава нишка, след това планирана и по-късно планиращият файл изпълнява нишката. Докато работещата нишка може да бъде блокирана или спряна за някаква друга дейност. След това се възобновява и докато обработката завърши, нишката се изпълнява.
Приоритети в нишките
Приоритетът на нишката решава как да се третира една нишка по отношение на другите нишки в приложение. Приоритетът на нишката е цяло число.
По-долу са изброени някои точки, които трябва да се помнят относно приоритетите на нишките:
- Приоритетите на нишките са цели числа.
- Използвайки приоритет на нишката, можем да решим кога да преминем от една нишка в работещо състояние към друга. Това е процесът на превключване на контекста, при който превключваме контекстите на нишките.
- По всяко време нишка може доброволно да освободи контрола си върху процесора. Тогава нишката с най-висок приоритет може да поеме.
- По същия начин нишка с по-висок приоритет може да изпревари всяка друга нишка с по-нисък приоритет.
- Класът нишка осигурява метод setPriority (), който се използва за задаване на приоритета за нишката.
- Също така можем да използваме константи MIN_PRIORITY, MAX_PRIORITY или NORM_PRIORITY на мястото на цели числа.
Създайте нишка
Можем да създадем нишка, използвайки един от следните начини:
- Разширяване на класа на Java ‘Thread’.
- Прилагане на „Runnable“.
Разширяване на класа на Java „Thread“
Класът ‘Thread’ съдържа конструкторите и методите, които ни позволяват да създаваме и изпълняваме операции върху обект на нишка. Вътрешно Thread класът изпълнява Runnable интерфейс и също така разширява Object класа.
Следващата таблица дава резюме на различни конструктори и методи на клас Thread ().
Строител/ | Прототип | Описание |
---|---|---|
сън | публичен празен сън (дълги милисекунди) | Изпълнението на текущата нишка се спира за определени милисекунди. |
Конструктор на нишки () | Тема () | Конструктор по подразбиране за създаване на обект Thread. |
Нишка (име на низ) | Конструктор за създаване на Thread обект с посочено име. | |
Конец (Runnable r) | Създайте екземпляр на Thread с посочен обект на интерфейс Runnable. | |
Нишка (Runnable r, String name) | Създайте екземпляр на нишка с посочен обект на интерфейс Runnable и дадено име | |
бягай | публично пусто изпълнение () | Методът Run изпълнява действието за нишка. Призовава нишката. |
старт | обществен празен старт () | Използва се за стартиране на изпълнението на нишката. Вътрешно JVM извиква метод run () за тази нишка. |
присъединяване | публично невалидно присъединяване () | Изчакайте нишката да умре |
публично невалидно присъединяване (дълги милисекунди) | Изчакайте определени милисекунди, докато нишката умре. | |
getPriority | public int getPriority () | Върнете приоритета на нишката |
setPriority | public int setPriority (int prioritet) | Променете приоритета на нишката на зададен приоритет |
getName | публичен низ getName () | връща името на нишката. |
setName | public void setName (Име на низ) | Задайте името на нишката на посочен низ |
currentThread | обществена нишка currentThread () | Връща препратката към нишката, която е активна в момента |
getId | публичен int getId () | Върнете нишката Id |
getState () | публичен Thread.State getState () | Връща текущото състояние на нишката |
isAlive | публичен булев isAlive () | Проверете дали нишката е жива и върнете true, ако да. |
добив | публична невалидна доходност () | Временно поставя на пауза текущата нишка и позволява изпълнението на други нишки. |
isDaemon | публичен булев isDaemon () | Проверете дали нишката е демонова нишка; върнете true ако да. |
setDaemon | public void setDaemon (логическо b) | Задайте нишката като демонова нишка, ако b = true; друго зададено като потребителска нишка. |
прекъсвам | публично прекъсване на празнотата () | Прекъснете текущата нишка. |
isInterrupted | публично булево isInterrupt () | Проверете дали нишката е прекъсната. |
прекъсна | публично статично булево прекъснато () | Проверете дали текущата нишка е прекъсната. |
dumpStack | Статичен празен dumpStack () | Отпечатва проследяване на стека от текущата нишка към стандартния поток за грешка. |
спиране | спиране на публичната невалидност () | Спира всички нишки. (** методът е оттеглен в най-новите версии на Java) |
продължи | публична невалидна автобиография () | Възобновете окачен конец. (** методът е оттеглен в най-новите версии на Java) |
Спри се | публично спиране на празнотата () | Спира конеца. (** методът е оттеглен в най-новите версии на Java) |
Ще разгледаме тези методи на нишките в следващия урок за многопоточност.
Стартиране на нишка
Методът start (), който се използва за стартиране на нишката, изпълнява следните стъпки:
- Стартира нов екземпляр на нишка с нов CallStack.
- Състоянието на нишката се променя от ново на изпълним.
- Когато е ред на нишката, тя изпълнява метода run ().
Внедряване на интерфейса „Runnable“
Екземпляр на нишка също може да бъде създаден с помощта на интерфейса Runnable. За да се създаде екземпляр на нишка, класът, чиито обекти трябва да бъдат изпълнени от нишка, трябва да реализира интерфейса Runnable.
Интерфейсът Runnable има само един метод:
public void run () => this method is used to execute the thread.
Пример за клас на нишка
Сега нека демонстрираме нишка в Java с помощта на клас нишка.
//class inherited from 'Thread' class ThreadClassDemo extends Thread { private int number; //class constructor public ThreadClassDemo(int number) { this.number = number; } //run method => execution code for thread public void run() { int counter = 0; int numInt = 0; //prints the number till specified number is reached, starting from 10 do { numInt = (int) (counter + 10); System.out.println(this.getName() + ' prints ' + numInt); counter++; } while(numInt != number); System.out.println('** Correct! ' + this.getName() + 'printed ' + counter + ' times.**'); } } public class Main { public static void main(String [] args) { System.out.println('Starting thread_1...'); //create a thread class instance Thread thread_1 = new ThreadClassDemo(15); //start the thread thread_1 thread_1.start(); try { //wait for thread_1 to die thread_1.join(); } catch (InterruptedException e) { System.out.println('Thread interrupted.'); } System.out.println('Starting thread_2...'); Thread thread_2 = new ThreadClassDemo(20); //start thread_2 thread_2.start(); System.out.println('main() is ending...'); } }
Изход
Нишка на Java, използваща изпълним интерфейс
Следващият пример демонстрира използването на интерфейса Runnable за създаване на екземпляр на нишка.
//class implements Runnable interface class RunnableDemo implements Runnable { private String message; //class constructor public RunnableDemo(String message) { this.message = message; } //run method public void run() { while(true) { System.out.println(message); } } } public class Main { public static void main(String [] args) { //create first thread instance hello Runnable hello = new RunnableDemo('Hello, Greetings!!!'); Thread thread1 = new Thread(hello); thread1.setDaemon(true); //set this thread as daemon thread1.setName('hello'); System.out.println('Starting First thread...'); //start the thread thread1.start(); //create second thread instance bye Runnable bye = new RunnableDemo('Bye for now!!'); Thread thread2 = new Thread(bye); thread2.setPriority(Thread.MIN_PRIORITY); //set priority to min thread2.setDaemon(true); //set as daemon thread System.out.println('Starting goodbye thread...'); //start the thread thread2.start(); System.out.println('main() is ending...'); } }
Изход
Как да спрете нишка в Java
Видяхме примери за нишки по-горе. От тези примери знаем, че когато методът run изпълни изпълнението, нишката спира или също спира поради някои изключения.
По-ранните версии на Java имаха метод stop () в клас Thread, който можеше да се използва за директно спиране на нишката. Но сега е оттеглено от съображения за безопасност. По този начин трябва да използваме другите методи, за да спрем нишката, която се изпълнява.
Има два метода, които можем да използваме, за да спрем нишката.
- Използване на променлива булева променлива
- Използване на прекъсвания.
В този раздел ще обсъдим и двата метода за спиране на нишка.
Използване на летлива булева променлива
В този метод поддържаме булева променлива say flag, за да спрем нишката. Нишката работи, докато логическата променлива е зададена на true. В момента, в който стане фалшив, нишката се спира.
Специалността на този метод е, че декларираме булевата променлива като „ летлив ”, Така че да се чете винаги от основната памет и програмата да не може да го кешира в кеша на процесора. По този начин няма да има разлика в зададените и отчетени стойности.
Изпълнението на спиране на нишка с помощта на променлива булева променлива е показано по-долу.
class StopThread extends Thread { private volatile boolean stop_flag = true; //initially set to true public void stopRunning() { stop_flag = false; //set stop_flag to false } @Override public void run() { while (stop_flag) { //keep checking value of stop_flag System.out.println('Thread is running...'); } System.out.println('Thread stopped!!!'); } } public class Main { public static void main(String[] args) { //create a thread instance StopThread stop_thread = new StopThread(); //start the thread stop_thread.start(); try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } //call stopRunning() method to stop the thread stop_thread.stopRunning(); } }
Изход
Забележка: Тук сме показали само част от резултата. Нишката може да работи няколко минути, преди да спре. За да можем да получим различни резултати в различните системи.
какво е моето потребителско име и парола за рутера
Използване на прекъсвания
Тук нишката е спряна с помощта на метода interrupt (), както вече обсъдихме по-горе в методите за клас нишки. Методът interrupt () задава състоянието на нишката като прекъснато. Това състояние се предава на цикъла while на метода run (). Можем да получим прекъснато състояние, използвайки метода interrupt ().
Следващата програма демонстрира използването на метод interrupt () за спиране на нишката.
class StopThread extends Thread { @Override public void run() { while (!Thread.interrupted()) { //check for interrupted status System.out.println('Thread is running...'); } System.out.println('Thread stopped!!!'); } } public class Main { public static void main(String[] args) { //create a thread instance StopThread stop_thread = new StopThread(); //start the thread stop_thread.start(); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } //interrupt the thread stop_thread.interrupt(); } }
Изход
често задавани въпроси
В # 1) Защо използваме Multithreading в Java?
Отговор: Многопоточността позволява едновременно или едновременно изпълнение на две или повече нишки в приложение. Едновременното изпълнение увеличава пропускателната способност и също така използва процесора до своя максимум.
В # 2) Какво е Multithreading? Какви са видовете му?
Отговор: Многопоточност означава изпълнение на повече от една нишка. Това изпълнение може да бъде едновременно или паралелно. По този начин, многопоточността има два типа, т.е.едновременно или паралелно.
В # 3) Какво е многонишковото и многопроцесорното?
Отговор: При многопоточност има множество нишки за едни и същи или различни процеси и тези нишки се изпълняват едновременно, за да подобрят изчислителната скорост на системата. При многопроцесорната обработка системата има повече от два процесора и множество процеси се изпълняват едновременно.
В # 4) Какви са предимствата на Multithreading в Java?
Отговор: Използвайки многопоточност, можем да изпълняваме различни части на приложение едновременно, като използваме нишки. Многопоточността увеличава производителността на системата. Многопоточността също увеличава максимално използването на процесора, тъй като различни нишки непрекъснато използват процесора.
Въпрос # 5) Добре ли е многопоточността за игри?
Отговор: Да, особено за съвременните игри.
Заключение
Всичко е свързано с въвеждането на многопоточност. В този урок обсъдихме паралелността и многопоточността в Java. Обсъдихме създаването на нишка с клас Thread, както и интерфейса Runnable и предоставихме подходящи примери.
Също така научихме концепциите на една нишка и нейното създаване в детайли. Концепциите за нишките, включително жизнения цикъл на нишка, спирането на нишка, видовете нишки и т.н. са обсъдени в този урок.
Обсъдихме също така многопоточност и едновременност в Java. В края на този урок читателят трябва да може лесно да схване понятията за съвпадение и многопоточност, както и нишки в Java.
=> Внимавайте тук за простите учебни серии за Java.
Препоръчително четене
- Многопоточност в C ++ с примери
- Java нишки с методи и жизнен цикъл
- Thread.Sleep () - метод на Sleep Thread () в Java с примери
- Урок за JAVA за начинаещи: 100+ практически ръководства за Java видео
- Урок за отражение на Java с примери
- Java String съдържа () Урок за метод с примери
- Назъбен масив в Java - урок с примери
- Урок за клас Java Scanner с примери