Негизги айырма – уктоо менен Javaда күтүү
Уйку жана күтүү - Java'да көп агым үчүн колдонулган эки ыкма. Уйку ыкмасы Thread классына тиешелүү, ал эми күтүү ыкмасы Object классынан. Java'да уйку менен күтүүнүн ортосундагы негизги айырмачылык, уйку учурдагы жиптин аткарылышын миллисекунддордун белгиленген санына токтотуу үчүн колдонулат, ал эми күтүү ыкмасы учурдагы жип башка жип билдирүүнү чакырмайынча күтүү үчүн колдонулат. объект үчүн notifyAll ыкмасы.
Жип операциялык тутумдагы иштетүүнүн эң кичине бирдиги. Бул программанын ичиндеги башкаруунун бирдиктүү ырааттуу агымы. Жиптер жеңил. Multithreading - бул бир эле учурда бир нече жипти иштетүү механизми. Java сыяктуу программалоо тилдери көп агымды колдойт. Multithreading артыкчылыктарга ээ, анткени ал бир эле учурда бир нече жипти иштетүүгө мүмкүндүк берет жана жиптер бири-биринен көз карандысыз. Javaда көп агым үчүн колдонула турган ыкмалар бар. Алардын экөө уктап, күтүп жатышат.
Java'да уйку деген эмне?
Операция тутумунда бир нече процесстер иштейт. Процесс - бул аткарылып жаткан программа. Ар бир процессте бир нече жиптер болушу мүмкүн жана бул жиптердин ортосунда контексттик которуштуруу бар. Javaда жипти түзүүнүн эки жолу бар. Бул жип классын кеңейтүү же Runnable интерфейсин ишке ашыруу аркылуу. Thread классында жипте операцияларды түзүү жана аткаруу үчүн конструкторлор жана методдор бар. Thread классы Object классын кеңейтет жана Runnable интерфейсин ишке ашырат. Runnable интерфейсин инстанциялары жип менен аткарууга арналган каалаган класс тарабынан ишке ашырылышы керек. Жип аткарылганда, аткарыла турган код run методунун ичинде жазылат. Иште турган жип жипти пландаштыруучу тарабынан тандалат. Бир процессте бир гана жип иштейт.
Жип бир нече фазадан өтөт. Thread классынын объектисин жараткандан кийин, программист баштоо ыкмасын чакыра алат. Бул ыкманы колдонуудан мурун жип жаңы абалда деп айтылат. Жип пландоочусу иштетүү үчүн жипти тандайт. Эгерде жип жипти пландаштыруучу тарабынан тандала элек болсо, бирок баштоо ыкмасы чакырылса, анда жип иштетилүүчү абалда болот. Жип пландоочусу аткаруу үчүн жипти тандагандан кийин, ал иштеп жаткан абалга өтөт. Жип тирүү болсо, бирок учурда иштетүүгө жарамсыз болсо, анда ал иштетилбеген же бөгөттөлгөн абалда. Иштөө ыкмасы аяктагандан кийин жип токтотулган абалга өтөт. Бул жиптин жашоо циклинин негизги фазалары.
Жип классында ар кандай тапшырмаларды аткаруу үчүн ар кандай ыкмалар бар. Уйку ыкмасы белгилүү бир убакытка чейин уктоо үчүн колдонулат. Уйку ыкмасынын синтаксиси коомдук бош уйку (узун миллисекунд) InterruptedException ыргытат. Бул учурда аткарылып жаткан жипти белгиленген миллисекунддар үчүн убактылуу аткарууну токтотууга алып келет. Эгер башка жип учурдагы жипти үзсө, бул өзгөчөлүк ыргытылганда учурдагы жиптин үзүлгөн абалы тазаланат.
01-сүрөт: Уйку ыкмасы менен Java программасы
Жогорудагы программага ылайык, иштетүү ыкмасы аткарылышы керек болгон кодду камтыйт. Негизги программада ExampleThread1дин эки объектиси түзүлөт жана аларда баштоо ыкмалары чакырылат. Бул иштетүү ыкмасынын ичиндеги кодду иштетүүгө мүмкүндүк берет. Бир убакта бир гана жип аткарылат. Thread менен.уктоо (1000); биринчи жипке аткарууну 1000 миллисекундга токтотууга мүмкүндүк берет. Жип уктап жатканда, жип пландоочу башка жипти тандап алат.
Java'да күтүү деген эмне?
Бир нече жип бөлүшүлгөн булакка кире алат. Бул туура эмес чыгарууну жаратышы мүмкүн. Жипти синхрондоштуруу бөлүшүлгөн ресурска жетүү үчүн бир гана жипти жасоо үчүн колдонулушу мүмкүн. Төмөнкүдөй кырдаалды кабыл алыңыз. Эгерде t1 жана t2 сыяктуу эки жип бар болсо, t1 маанилерди Text1.txt деп аталган текст файлына сактай баштайт. Бул маанилер t1 кайтып келгенде башка эсептөөлөр үчүн колдонулат. Эгерде t2 t1 кайтып келгенге чейин башталса, t2 t1 тарабынан сакталган маанилерди өзгөртө алат. Бул t1 туура эмес чыгарууну камсыз кылууга алып келиши мүмкүн. Синхрондоштуруунун жардамы менен, t1 Text1.txt файлын колдоно баштаганда, ал файл кулпуланышы мүмкүн, андыктан ага t1 гана жеткиликтүү болот. t1 ошол текст файлына кирүү үчүн кулпуну бошотмоюнча t2 аны өзгөртө албайт. Тапшырма аяктагандан кийин, t1 кулпусун коё алат. Кулпу монитор катары да белгилүү.
Жипти синхрондоштурууга жиптер аралык байланыш аркылуу жетишүүгө болот. Критикалык бөлүм - бул бөлүшүлгөн ресурстарга кире турган код сегменти. Жиптер аралык байланышта жип өзүнүн критикалык бөлүмүндө иштеп жаткан тындырылат жана башка жип аткарыла турган ошол эле критикалык бөлүмгө кирүүгө уруксат берилет. Бул күтүү, кабарлоо жана notifyAll ыкмаларын колдонуу менен ишке ашырылат. Алар Object классына кирет. Күтүү ыкмасы учурдагы жиптин кулпуну бошотуусуна уруксат берүү үчүн колдонулат жана башка жип объект үчүн notify же notifyAll ыкмасын чакырганга чейин күтөт. Билдирүү ыкмасы кулпусун күтүп жаткан бир жипти ойготуу үчүн колдонулат. notifyAll кулпусун күтүп жаткан бардык жиптерди ойготот.
02-сүрөт: Калькулятор классы
03-сүрөт: Негизги ыкма
Калькулятор классы Жипти кеңейтет. Шайкештештирилген блок иштетүү ыкмасынын ичинде. For цикли жана кабарлоо ыкмасы синхрондоштурулган блоктун ичинде. Негизги методдун ичинде жиптин инстанциясы түзүлгөн жана баштоо ыкмасы ошол инстанцияда чакырылат. Негизги ыкма жип эскертме бергенге чейин күтөт. Программаны аткарууда, негизги ыкма иштетүү ыкмасынын бүткүл аткарылышын күтөт жана кабарлоо ыкмасын күтөт. Кабарлоо ыкмасы чакырылгандан кийин, негизги ыкма күтүүнү токтотуп, калган кодду аткара баштайт. Негизги Калькулятор жип аяктаганга чейин күтүп жатат. Акырында, сумманын жыйынтыгы чыгарылат.
Эгерде синхрондоштурулган блок жок болсо жана негизги ыкма төмөндөгүдөй кодго ээ болсо, ал башка жиптин бүтүшүн күтпөгөндүктөн, натыйжаны нөл катары берет.
Калькулятор t1=жаңы Калькулятор ();
t1. баштоо ();
System.out.println (t1.sum);
Жавада уйку менен күтүүнүн кандай окшоштугу бар?
Уйку да, күтүү да Java'да көп агымды ишке ашырууда колдонула турган ыкмалар
Жавада уйку менен күтүүнүн ортосунда кандай айырма бар?
уйку жана Javaда күтүү |
|
Уйку ыкмасы учурдагы жипти системанын таймерлеринин жана пландоочуларынын тактыгына жана тактыгына жараша, белгиленген миллисекунд санына аткарууну убактылуу токтотот. | Күтүү ыкмасы учурдагы жип объект үчүн notify же notifyAll ыкмасын башка жип чакырмайынча күтүүгө себеп болот. |
Кулпу менен ассоциация | |
Уйку ыкмасы синхрондоштуруу учурунда объекттин кулпусун бошотпойт. | Күтүү ыкмасы синхрондоштуруу учурунда кулпуну бошотот. |
Аткаруу ыкмасы | |
Уйку ыкмасы учурдагы жипте аткарылган. | Объектте күтүү ыкмасы чакырылат. |
Байланыштуу класс | |
Уйку бул Thread классынын ыкмасы. | Күтүү - бул Object классынын ыкмасы. |
Аятыруу | |
Уйку процесси көрсөтүлгөн убакыт аяктагандан кийин бүтөт. | Күтүү ыкмасы notify же notifyAll ыкмаларды чакыруу менен үзгүлтүккө учурайт. |
Корытынды – Java тилинде уктоо жана күтүү
Операция тутумунда бир нече процесстер иштеп жатат. Ар бир процесс бир нече жиптерге ээ болушу мүмкүн. Жип - бул операциялык системадагы иштетүүнүн эң кичинекей бирдиги. Java программалоо тили көп агымды колдойт. Бул бир эле учурда бир нече жипти иштетүүгө мүмкүндүк берет. Уйку жана күтүү - бул көп агымды ишке ашырууда колдонула турган эки ыкма. Java'да уйку менен күтүүнүн айырмасы, уйку учурдагы жиптин аткарылышын миллисекунддордун белгиленген санына токтотуу үчүн колдонулат, ал эми күтүү ыкмасы учурдагы жипти башка жипти notify же notifyAll чакырмайынча күтүүгө алып келүү үчүн колдонулат. объект үчүн ыкма.