lecture tread
TRANSCRIPT
Жава Технологи
Улаанбаатар Дээд Сургууль
Бэлтгэсэн: Багш Б.Ганзориг
THREAD
Агуулга: Tread ойлголт Tread үүсгэх Tread pool Tread хоорондын нөөцийн хуваарилалт
THREAD ОЙЛГОЛТ
Програмд нэг зэрэг олон үйлдэл гүйцэтгэх боломж олгоно– Жишээ нь сервер програм олон клиентүүдтэй
зэрэг ажиллах– График анимац ажиллаж байхад хэрэглэгч өөр
үйлдлүүдийг хийх боломж олгох– Хоёр болон түүнээс дээш анимац зэрэг ажиллах
боломж олгох
THREAD ОЙЛГОЛТ
Хэрэглэгчийн зохиосон програм нь ядаж нэг thread ашигласан байдаг
– Хэрэглэгч thread –ийг үүсгээгүй үед ч хэрэглэгчийн зохиосон програм хангамж нь өөрөө thread болдог
THREAD ОЙЛГОЛТ
Дараах жишээгээр thread –ийг тайлбарлая
– Файлаас өгөгдлийг хэсэг хэсгээр нь уншиж боловсруулаад өөр файлд бичдэг програм
THREAD ОЙЛГОЛТ
Thread ашигласан эхний жишээ:– Програм эхний хэсгийг уншиж боловсруулаад
файлдаа бичингүүтээ дараачийн хэсгийг авах замаар ажиллана. Энэ тохиолдолд бид уг процессийг дуусгахын тулд нэг thread ашиглаж байна.
THREAD ОЙЛГОЛТ
Thread ашигласан хоёрдугаар жишээ:– Дээрх жишээн дээрх үйлдлийг гурван thread
ашиглан гүйцэтгэе. – Эхний thread файлаас хэсэг хэсгээр уншиж байхад
хоёр дахь thread нь уншсан хэсгийг боловсруулж гурав дахь thread нь боловсруулсан хэсгийг өөр файлд бичих үйлдлийг хийнэ.
THREAD ОЙЛГОЛТ
Хоёр дахь жишээн дээр гурван ширхэг thread ашигласан нь:
– Нэгэнт энэ гурван thread зэрэг ажиллах тул эхний жишээн дээрх програмыг бодвол илүү богино хугацаанд ажиллах чадвартай.
THREAD ОЙЛГОЛТ
Хоёр дахь жишээн дээр нэг асуудал үүснэ:– Хоёр дахь thread нь эхний thread-ийг өгөгдлөө
уншиж дууссаны дараа л боловсруулалт хийх ёстой.
– Тиймээс програм зохиогч thread хооронд мэдээлэл дамжуулах шаардлага гарна.
THREAD ҮҮСГЭХ
Thread классын объект эсвэл уг классаас удамшсан классын объектийг үүсгэх замаар програмд thread –ийг үүсгэнэ.
Thread –ийг үүсгэснийхээ дараа start() функцыг нь дуудаж ажиллуулна.
THREAD ҮҮСГЭХ
Thread-ийн ажиллуулдаг код нь run() функц дотор байдаг бөгөөд энэ функцыг програм зохиогч бичиж өгдөг. Start() функц нь ажиллагаагаа эхлүүлэхдээ run() функцыг дууддаг.
Thread нь өөрөө дотроо дахин thread үүсгэх замаар ажиллаж болно
THREAD ҮҮСГЭХ
Thread үүсгэхэд анхаарах зүйлс: – Thread –ийг үйлдлийн систем үүсгэж ажиллуулдаг– Thread нь хэрэглэгчийн зохиосон програмтай зэрэг
ажиллах чадвартай байдаг. – Thread нь хэрэглэгчийн зохиосон програмаас
тусдаа бие даасан програм юм.
THREAD ҮҮСГЭХ
Thread үүсгэхэд анхаарах зүйлс: – Start() функц нь үйлдлийн системд шинээр thread
үүсгэн ажиллуулахыг зааж өгдөг. – Хэрэв шууд run() функцыг програм дотроосоо
дуудвал (өөрөөр хэлбэл start() функцыг дуудалгүйгээр) програмд гажилт үүсдэг.
THREAD ҮҮСГЭХ
Thread-ийг хоёр хэлбэрээр үүсгэж болдог. – Thread классын объект эсвэл уг классаас
удамшсан классын объектийг үүсгэх замаар
– Runnable интерфэйсийн имплемент хийсэн классын объектийг үүсгэх замаар
THREAD ҮҮСГЭХ
Main thread: Програмын үндсэн функцыг ажиллуулахад програмын үндсэн thread үүсэх бөгөөд үүнийг main thread гэнэ.
Daemon thread: Үндсэн thread-ийг хаахад үндсэн thread-ийн үүсгэсэн thread-үүд нь хамт үхэж байвал эдгээр нь daemon thread юм.
setDaemon(true) гэж thread-ийг daemon болгоно
THREAD ҮҮСГЭХ
Хэрэв үндсэн thread-үүдийг хаахад үхэлгүйгээр үлдэж байвал энэ thread нь хэрэглэгчийн thread юм.
THREAD ЖИШЭЭ
THREAD ЖИШЭЭ
THREAD ЖИШЭЭ
THREAD ЖИШЭЭ
THREAD ХЭРЭГЛЭЭ
Сервер програмын бүтэц– Сервер програм нь ажиллаж эхлэнгүүтээ гаднаас
ирэх хүсэлтүүдийг сонсох зорилготой хэд хэдэн сонсогч daemon thread-үүдийг үүсгэдэг
– Хэрэв гаднаас нэг хүсэлт ирвэл эдгээр thread-үүдийн аль нэг нь уг хүсэлтийг барьж аваад хүсэлтийг боловсруулах үүрэгтэй өөр нэг хэрэглэгчийн thread үүсгэдэг.
THREAD ХЭРЭГЛЭЭ
үргэлжлэл
– Ингэснээр олон зэрэг хүсэлтэй ажиллах боломжтой болно.
– Хүсэлт бүрийг нэг thread биелүүлдэг. – Хүсэлтийг биелүүлж дуусангуутаа уг thread өөрөө
устдаг.
THREAD ХЭРЭГЛЭЭ
үргэлжлэл
– Сервер програмыг хаахад сонсогч thread-ууд хамт хаагдаж байвал daemon thread харин хүсэлтийг боловсруулж байгаа thread үйл ажиллагаагаа үргэлжлүүлэн үлдэж байвал хэрэглэгчийн thread болно.
– Ингэснээр програмын найдвартай байдал нэмэгддэг.
THREAD POOL
Сервер програмын бүтэц– Сервер нь төгсгөлгүй олон thread үүсгэж мэдээж
болохгүй. thread олон үүсэх тусам сервер компьютер дээрх ачаалал нэмэгддэг.
– Энэ асуудлыг шийдвэрлэх зорилгоор сервер програм нь thread pool хэмээх зүйлийг хэрэглэдэг.
THREAD POOL
– Сервер нь thread pool үүсгэн түүн дотор тодорхой тооны thread-үүдийг үүсгэж хийдэг.
– Хэрэв серверт хүсэлт ирвэл түүнийг цөөрөм доторх сул thread-д өгнө.
– Харин бүх thread –үүд ажилтай байвал уг хүсэлтийг биелүүлэх шинэ thread үүсгэхгүй.
– Серверт ирсэн хүсэлт нь цөөрөм дэх аль нэг thread ажлаа дуусган сулрахыг хүлээнэ.
THREAD run() функц
run() функц доторх код нь thread-ийг ажиллуулах код юм. Энэ функц нь Thread классаас удамшин ирдэг.
Thread класс доторх run() функц нь кодгүй байдаг тул програм зохиогч кодыг бичих шаардлагатай.
THREAD run() функц
sleep(millsecond) функц нь заагдсан хугацаагаар thread –ийн үйл ажиллагааг зогсоодог. Энэ нь бусад thread –ийг ажиллах боломжийг олгодог.
sleep() функцыг ашиглах тохиолдолд try catch хэрэглэх ёстой. Учир нь thread –ийг унтаж байх хугацаанд нь өөр бусад зүйл сэрээвэл InterruptedException дуудагдана.
THREAD ОЙЛГОЛТ
Өөр thread-ээс одоо ажиллаж буй thread –ийг үйл ажиллагаагаа зогсоохыг хүсч болно. Энэ тохиолдолд уг ажиллаж буй thread –ийн interrupt() функцыг дуудна.
THREAD ОЙЛГОЛТ
Энэ функц нь уг thread-ийг шууд зогсоохгүй боловч зогсоохыг хүссэн флагийг true болгодог.
Харин ажиллаж буй thread-ийн run() функц дотор энэ флагийг true болсон эсэхийг шалгаж байх хэрэгтэй.
THREAD ОЙЛГОЛТ
sleep() функц нь энэ флагийг шалгаад true болсон байвал InterruptedException үүсгэдэг.
Thread-ийг interrupt хийсэн эсэхийг шалгахдаа isInterrupted() функцыг дуудаж болно. Хэрэв уг thread-ийг interrupt хийсэн байсан бол энэ функц нь true утга буцаадаг.
THREAD ОЙЛГОЛТ
Өөр thread дотроос өөр thread –ийг interrupt болсон эсэхийг энэ функцыг ашиглаж шалгаж болно.
Жишээ нь үндсэн thread дотроос first thread –ийг шалгахдаа:
THREAD ОЙЛГОЛТ
Гэхдээ энэ нь first thread-ийг үйл ажиллагаагаа зогсоосон эсэхийг баталгаатай хэлж чадахгүй.– Учир нь first thread interrupt хүсэлтийг авсан ч үйл
ажиллагаагаа үргэлжлүүлсээр байж болно. Үйл ажиллагаагаа үнэхээр зүгсоосон эсэхийг
шалгахдаа isAlive() функцыг ашиглан шалгадаг.
THREAD ОЙЛГОЛТ
isInterrupted() функц нь уг thread-ийн флагт өөрчлөлт оруулдаггүй бол interrupted() функц нь флагыг шалгаад үнэн бол цэвэрлээд (false болгоод) true утга буцаадгаараа ялгаатай.
InterruptedException үүссэн бол thread нь catch хэсгээрээ барьж аваад уг флагаа цэвэрлэдэг тул үүний дараа дуудагдсан isInterrupted(), interrupted() функцууд нь false утга буцаана.
THREAD ОЙЛГОЛТ
Хэрэв ямар нэг thread –ийг одоо ажиллаж буй thread –ийг ажиллаж дуустал хүлээлгэх хэрэг гарвал уг thread –ийн join() функцыг дуудна. – thread1.join()