Проблемаҳое, ки чанд ришта дар Java ҳал мекунанд
Аслан, Java multithreading барои ҳалли ду мушкилоти асосӣ ихтироъ шудааст:-
Якчанд амалҳоро дар як вақт иҷро кунед.
Дар мисоли дар боло овардашуда риштаҳои гуногун (яъне аъзоёни оила) якчанд амалро дар як вақт иҷро мекарданд: зарфҳоро шуста, ба мағоза рафтанд, чизҳоро печонд.
Мисоли бештар «барномасоз»-ро овардан мумкин аст. Тасаввур кунед, ки шумо як барнома бо интерфейси корбар доред. Вақте ки тугмаи Continue пахш карда мешавад, бояд дар дохor барнома баъзе ҳисобҳо сурат гиранд ва корбар бояд экрани интерфейси зеринро бубинад. Агар ин амалҳо пайдарпай анҷом дода шаванд, пас аз пахш кардани тугмаи "Идома" барнома танҳо ях мекунад. Истифодабаранда ҳамон экранро бо тугмаи "Идома додан" мебинад, то он даме, ки ҳама ҳисобҳои дохилӣ ба анҷом расад ва барнома ба қисмате мерасад, ки интерфейс ба кашидани он оғоз мешавад.
Хуб, биёед якчанд дақиқа интизор шавем!
Мо инчунин метавонем барномаи худро аз нав таҳия кунем ё, тавре ки барномасозон мегӯянд, "параллелизатсия" кунем. Бигзор ҳисобҳои зарурӣ дар як ришта анҷом дода шаванд ва интерфейс дар дигар. Аксари компютерҳо барои ин захираҳои кофӣ доранд. Дар ин ҳолат, барнома "беақл" нахоҳад буд ва корбар оромона дар байни экранҳои интерфейс ҳаракат мекунад, бидуни хавотирӣ аз он чӣ дар дохor он рӯй медиҳад. Ин халал намерасонад :)
-
Ҳисобкуниро суръат диҳед.
Дар ин ҷо ҳама чиз хеле соддатар аст. Агар протсессори мо якчанд ядро дошта бошад ва аксари протсессорҳо ҳоло бисёраслӣ бошанд, рӯйхати вазифаҳои моро дар баробари якчанд ядроҳо ҳал кардан мумкин аст. Аён аст, ки агар мо бояд 1000 масъаларо ҳал кунем ва ҳар яки онҳо дар як сония ҳал карда шаванд, як ядро дар 1000 сония, ду ядро дар 500 сония, се ядро дар тӯли 333 сония ва ғайра аз ӯҳдаи ин рӯйхат мебарояд.
Thread
. Яъне барои сохтани 10 ришта ба шумо 10 an objectи ин синф лозим мешавад. Биёед мисоли соддатаринро нависед:
public class MyFirstThread extends Thread {
@Override
public void run() {
System.out.println("I'm Thread! My name is " + getName());
}
}
Барои эҷод ва оғоз кардани риштаҳо, мо бояд синф эҷод кунем ва онро аз java.lang
. Thread
ва усулро дар он бекор кунед run()
. Охирин хеле муҳим аст. Маҳз дар усуле, ки run()
мо мантиқеро муқаррар мекунем, ки риштаи мо бояд иҷро шавад. Ҳоло, агар мо як мисол эҷод кунем MyFirstThread
ва онро иҷро кунем, усул run()
сатри номи худро ба консол чоп мекунад: усул getName()
номи "система"-и риштаро чоп мекунад, ки ба таври худкор таъин карда мешавад. Ҳарчанд, дар асл, чаро "агар"? Биёед эҷод кунем ва озмоиш кунем!
public class Main {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
MyFirstThread thread = new MyFirstThread();
thread.start();
}
}
}
Натиҷаи консол: Ман Thread ҳастам! Номи ман Thread-2 Ман Thread ҳастам! Номи ман Thread-1 Ман Thread ҳастам! Номи ман Thread-0 Ман Thread ҳастам! Номи ман Thread-3 Ман Thread ҳастам! Номи ман Thread-6 Ман Thread ҳастам! Номи ман Thread-7 Ман Thread ҳастам! Номи ман Thread-4 Ман Thread ҳастам! Номи ман Thread-5 Ман Thread ҳастам! Номи ман Thread-9 Ман Thread ҳастам! Номи ман Thread-8 Мо 10 ришта (an object) эҷод мекунем MyFirstThread
, ки аз онҳо мерос мегиранд Thread
ва онҳоро тавассути даъват ба усули an object оғоз мекунанд start()
. Пас аз даъват кардани метод , start()
усули он ба кор оғоз мекунад run()
ва мантиқи дар он навишташуда иҷро мешавад. Лутфан таваҷҷӯҳ намоед: номҳои риштаҳо мувофиқ нестанд. Хеле аҷиб аст, чаро онҳо бо навбат ба қатл расонида нашуданд: Thread-0
, Thread-1
, Thread-2
ва ғайра? Ин маҳз як мисоли он аст, ки тафаккури стандартӣ ва "пайвандӣ" кор намекунад. Гап дар сари он аст, ки дар ин ҳолат мо танҳо фармон медиҳем, ки 10 ришта эҷод ва оғоз кунад. Бо кадом тартиб онҳо бояд ба кор андохта шаванд, нақшаи ришта муайян мекунад: механизми махсус дар дохor системаи оператсионӣ. Он чӣ гуна дақиқ сохта шудааст ва аз рӯи кадом принсип қарор қабул мекунад, як мавзӯи хеле мураккаб аст ва мо ҳоло ба он ғарқ намешавем. Чизи асосии дар хотир доштан дар он аст, ки барномасоз пайдарпайии иҷрои риштаро назорат карда наметавонад. Барои фаҳмидани ҷиддияти вазъият, кӯшиш кунед, ки усулро main()
аз мисоли дар боло овардашуда якчанд маротиба иҷро кунед. Натиҷаи дуюми консол: Ман Thread ҳастам! Номи ман Thread-0 Ман Thread ҳастам! Номи ман Thread-4 Ман Thread ҳастам! Номи ман Thread-3 Ман Thread ҳастам! Номи ман Thread-2 Ман Thread ҳастам! Номи ман Thread-1 Ман Thread ҳастам! Номи ман Thread-5 Ман Thread ҳастам! Номи ман Thread-6 Ман Thread ҳастам! Номи ман Thread-8 Ман Thread ҳастам! Номи ман Thread-9 Ман Thread ҳастам! Номи ман Thread-7 Намоиши консоли сеюм: Ман Thread ҳастам! Номи ман Thread-0 Ман Thread ҳастам! Номи ман Thread-3 Ман Thread ҳастам! Номи ман Thread-1 Ман Thread ҳастам! Номи ман Thread-2 Ман Thread ҳастам! Номи ман Thread-6 Ман Thread ҳастам! Номи ман Thread-4 Ман Thread ҳастам! Номи ман Thread-9 Ман Thread ҳастам! Номи ман Thread-5 Ман Thread ҳастам! Номи ман Thread-7 Ман Thread ҳастам! Номи ман Thread-8 аст
Мушкилоте, ки чанд ришта эҷод мекунанд
Дар мисоли китобҳо шумо дидед, ки бисёрҷабҳаҳо масъалаҳои хеле муҳимро ҳал мекунанд ва истифодаи он кори барномаҳои моро метезонад. Дар бисёр мавридҳо - бисёр маротиба. Аммо бесабаб нест, ки чанд ришта мавзӯи мураккаб ҳисобида мешавад. Охир, агар нодуруст истифода бурда шавад, ба чои халли онхо проблемахо ба вучуд меоварад. Вақте ки ман мегӯям, ки "мушкилот эҷод кунед", ман чизи абстрактиро дар назар надорам. Ду мушкилоти мушаххасе вуҷуд доранд, ки чанд ришта метавонад ба вуҷуд ояд: басташавӣ ва ҳолати мусобиқа. Бунбаст вазъиятест, ки дар он риштаҳои сершумор мунтазири захираҳои аз ҷониби ҳамдигар ишғолшуда мебошанд ва ҳеҷ яке аз онҳо наметавонад иҷроро идома диҳад. Мо дар лексияҳои оянда дар ин бора бештар сӯҳбат хоҳем кард, аммо ҳоло ин мисол кофӣ хоҳад буд: Тасаввур кунед, ки ришта-1 бо баъзе Объект-1 кор мекунад ва ришта-2 бо Объект-2 кор мекунад. Барнома чунин навишта шудааст:- Thread-1 кор бо Объект-1-ро қатъ мекунад ва ба Объект-2 мегузарад, вақте ки Thread-2 кор бо Объекти 2-ро қатъ мекунад ва ба Объект-1 мегузарад.
- Thread-2 кор бо Объект-2-ро қатъ мекунад ва ба Объект-1 мегузарад, вақте ки Thread-1 кор бо Объекти 1-ро қатъ мекунад ва ба Объект-2 мегузарад.
public class MyFirstThread extends Thread {
@Override
public void run() {
System.out.println("Выполнен поток " + getName());
}
}
public class Main {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
MyFirstThread thread = new MyFirstThread();
thread.start();
}
}
}
Акнун тасаввур кунед, ки барнома барои кори роботе, ки хӯрок тайёр мекунад, масъул аст! Ришта-0 тухмро аз яхдон мебарорад. Ҷараёни 1 оташдонро ба кор медарорад. «Стрим-2» табақчаро бароварда ба болои печка мегузорад. Маҷрои 3 дар болои печка оташ мегирад. Ҷараёни 4 ба табақ равған рехт. Ҷараёни 5 тухмҳоро мешиканад ва онҳоро ба табақи frying мерезад. Ҷараёни 6 снарядҳоро ба қуттии партов мепартояд. Stream-7 тухми пухтаи тайёрро аз гармӣ дур мекунад. «Поток-8» тухми пухтаро ба табак мегузорад. «Стрим-9» зарфхоро мешуяд. Ба натиҷаҳои барномаи мо нигаред: Thread-0 иҷро карда шуд Thread-2 иҷро карда шуд Thread-1 вентилятор иҷро карда шуд Thread-4 иҷро карда шуд Thread-9 executed Thread-5 сетои иҷрошуда Thread-8 иҷро карда шуд Thread-7 Thread-7 иҷро шуд. ришта иҷро шуд -3 Ришта-6 иҷро шуд Оё скрипт шавқовар аст? :) Ва ҳама аз он сабаб, ки кори барномаи мо аз тартиби иҷро шудани риштаҳо вобаста аст. Ҳангоми каме вайрон кардани пайдарпай, ошхонаи мо ба дӯзах табдил меёбад ва роботе, ки девона шудааст, ҳама чизро дар атрофи он нест мекунад. Ин инчунин як мушкor маъмул дар барномасозии бисёрсоҳавӣ аст, ки шумо дар бораи он на як бор мешунавед. Дар охири лексия ман мехостам ба шумо китоберо оид ба бисёрсоҳавӣ тавсия диҳам.
GO TO FULL VERSION