-
Объекттин бардык абалы кандай
Thread
?- ЖАНЫ
- RUNNABLE
- БЛОК КАЛГАН
- КҮТҮҮДӨ
- TIMED_WAITING
- ТОКТОТУЛГАН
-
Блокко киргенде жип кандай абалдарга бара алат
synchronized
?- RUNNABLE
- БЛОК КАЛГАН
RUNNABLEде, белгиленген code блогун
synchronized
башка жип ээлебесе. Болбосо, биздин жип BLOCKED абалын алат жана mutex an objectинин бошотулушун күтөт. - Методду чакырганда жип кандай абалга өтөт
wait()
?Бул ыкманы чакыруу жипти КҮТҮҮ абалына коет.
Метод учурдагы жип тарабынан "кулпуланган" мутекс an objectиндегиwait()
блоктун ичинде гана чакырылышы мүмкүн , антпесе, ыкма IllegalMonitorStateException өзгөчө учурун ыргытат .synchronized
Object monitor = getMonitor(); synchronized(monitor) { … monitor.wait(); … }
Метод чакырылгандаwait()
, учурдагы жип an objectтен кулпуну бошотуп , башка жип аркылууmonitor
методдун чакырылышын күтүп, КҮТҮҮ абалына кирет . Бул болоору менен жип ойгонот жана монитор бош эмес болсо, аны кармап, ишин улантат. Эгерде мониторду башка жип ээлеп турган болсо, учурдагы жип БЛОК КАЛГАН абалга өтөт.monitor.notify()
monitor.notifyAll()
-
Методду чакырганда жип кандай абалга өтөт
Бул ыкманы чакыруу жипти TIMED_WAITING абалына коет.wait(500)
?
Методдун аналогиясы боюнчаwait()
, аны учурдагы жип менен "кулпуланган (кулпуланган)" мутекс an objectисиндеwait(timeout)
блоктун ичинде гана чакырууга болот .synchronized
Object monitor = getMonitor(); synchronized(monitor) { … monitor.wait(500); … }
Методду чакырганда
wait()
, учурдагы жип an objectтен кулпуну бошотупmonitor
, 500 миллисекундга уктап калат. Объектmonitor
башка жип менен тартылышы мүмкүн.
500 миллисекунддан кийин жип ойгонот жанаmonitor
ал бош эмес болсо, аны кармап, ишин улантат.
Эгерде мониторду башка жип ээлеп турган болсо, учурдагы жип БЛОК КАЛГАН абалга өтөт.Методду чакырганда жип кандай абалга өтөт
notify()
?Object monitor = getMonitor(); synchronized(monitor) { … monitor.wait(); … }
кийинmonitor.wait()
, жип КҮТҮҮ абалына өтөт.notify()
Объекттеги башка жип менен чакырылган методmonitor
жипти КУТУП жаткан абалдан ИШТЕГЕН абалга жылдырат, эгерде монитор an objectисин башка жип басып албаса, антпесе БЛОК КАЛГАН абалга. -
Методду чакырганда жип кандай абалга өтөт
notifyAll()
?notifyAll()
бардык жиптер "калышат". Бардык "уктап жаткан" (КҮТҮҮ) жиптердин бири RUNNABLE абалына кирип, колдонулуп жаткан an objectтин мониторун өзүнө алат жана ишин улантат. Калгандары БЛОК КАЛГАН абалда болот. Биринчи "ойгонуу" жип башкалар күтүп жаткан мониторду бошотоор замат, анын тагдыры кийинки жип менен кайталанат (өзүм билемдик жип БӨЛӨГӨН абалдан ИШТЕГЕН абалга өтөт). Бул бардык "ойгонгон" жиптер БЛОК КАЛГАН абалдан чыкмайынча уланат. -
Синхрондоштурулган блоктун үч жиптери
Алардын экөө БӨЛӨГӨН абалга, бирөө ИШТЕГЕН абалга өтөтwait()
мутекс an objectи деп аталат. Төртүнчү жип чакырса, бул жиптер кандай абалга баратnotifyAll()
? -
Учурдагы жипти TIMED_WAITING абалына өткөрүп бергенине жана өткөрөjoin(500)
Ал эмнеси менен айырмаланатwait(500)
?join(500)
турганына карабастан , алардын ортосунда олуттуу айырмачылыктар бар: жипке чакырылган, бул блок синхрондоштурулган an objectте синхрондоштурулган блоктун ичинде чакырылган. Чакырганда, учурдагы жип методу бүтүрүү үчүн чакырылган жипти 500 миллисекунд күтөт . Чакырганда, учурдагы жип синхрондоштурулган an objectтен кулпуну бошотуп, 500 миллисекундга уктап калат. 500 миллисекунддан кийин эки учурда тең жиптер иштей берет.wait(500)
join(500)
wait(500)
join(500)
join()
wait(500)
-
wait(500)
Ал эмнеси менен айырмаланатsleep(500)
?sleep(500)
жипке чакырылган,wait(500)
бул блок синхрондоштурулган an objectтеги синхрондоштурулган блоктун ичинде чакырылган.
Чакырганда,sleep(500)
учурдагы жип 500 миллисекунд күтүп, андан кийин ишин улантат.
Чакырганда,wait(500)
учурдагы жип синхрондоштурулган an objectтин кулпусун бошотуп, 500 миллисекундга уктап калат. -
Методду чакырганда жип кандай абалга өтөт
Метод чакырылгандаyield()
?yield()
, учурдагы жип "өз кезегин өткөрүп жиберет" жана java дароо кийинки жипти аткарууга өтөт. Жип штаттанrunning
мамлекетке өтөтready
. Иштеп жаткан жана даяр абалдары RUNNABLE абалынын субстанциялары.
GO TO FULL VERSION