Algoritmlarni loyihalash. Maruzachi o’qituvchi: katta o’qituvchi Ganihodjayeva Dilfuza Ziyavutdinovna
Download 57.94 Kb.
|
AL 9 Maruza Kop oqimli dasturlash
Algoritmlarni loyihalash. Maruzachi o’qituvchi: katta o’qituvchi Ganihodjayeva Dilfuza Ziyavutdinovna 9-Maruza: Ko'p oqimlli dasturlash. Reja:
Ko'rsatmalar oqimlari va ko'p oqimli dasturlash. Oqimlarni yaratish va boshqarish. Resurslarni almashish va qulflash. Oqimlar orasidagi o'zaro ta'sir. Bir oqimli yondashuv muammolari. Protsessor vaqtining vazifasi bo'yicha monopoliyali egallash Mantiqan bog'liq bo'lmagan kod qismlarini aralashtirish Ularni ajratishga urinish dasturda yangi tizimlarning paydo bo'lishiga va kodning murakkabligiga olib keladi. K’op oqimli dasturlash. Tarkibiy ravishda bajariladigan ko'rsatmalar oqimni tashkil qiladi Oqimlar mustaqil ravishda ishlaydi Oqimlar bir-biri bilan o'zaro ta'sir qilishi mumkin Ko'p yadroli tizimda oqim faqat bitta yadroni egallaydi.
Agar bir nechta protsessorlar mavjud bo'lsa, nazariy jihatdan, ularning har biri alohida vazifaga ega bo'lishi mumkin. Bitta protsessorli kompyuter tizimi ishlatilsa nima qilish kerak? Vaqtni taqsimlash (Квантование времени (Time-Slicing)) Vaqt intervallarga bo'lingan (vaqt kesimlari) Kvant davomida bitta oqim ko'rsatmasi qayta ishlanadi Oqimni tanlash haqida qaror interval boshlanishidan oldin qabul qilinadi Yuqori chastotali oqimlarni almashtirish.
Bir nechta ilovalarning bir vaqtning o'zida ishlashi Bitta ilova bilan bir vaqtning o'zida bir nechta so'rovlarga xizmat ko'rsatish Bir nechta qurilmadan kelgan ma'lumotlarni bir vaqtning o'zida qayta ishlash Ishni yanada moslashuvchan boshqarish, vazifalarni sozlash qobiliyati
Quyi masalalarn oson ajratish Sekinroq ijro Ishlatilgan resurslar bo'yicha vazifalarni taqsimlashda bajarilish tezligining oshishi Ko'p yadroli tizimlarda ishlash samaradorligi Ish vaqtidagi nedeterminizm. Ilovalar sinfi Thread Amaliy oqim mavzusi "Thread" klassining namunasi bilan ko'rsatilgan. Bajarish oqimini yaratish uchun siz qilishingiz mumkin Thread-ni meros qilib olgan sinfni yarating run () usulini bekor qilmoq Oqimni ishga tushirish uchun boshlang'ich sinf ob'ektida start () usulidan foydalaning. Ilovalar sinfi(Thread )dan foydalanish. Sinf tavsifi public class <Имя класса> extends Thread { public void run() { // Действия, выполняемые потоком } } Oqim boshlanishi <Имя класса> t = new <Имя класса>(); t.start(); //именно start(), а не run() !!! Thread bilan ishlashga doir misol Sinf tavsifi public class MyThread extends Thread { public void run() { long sum = 0; for (int i = 0; i < 1000000; i++) { sum += i; } System.out.println(sum); } } Oqim boshlanishi MyThread t = new MyThread(); t.start(); // 499999500000 Runnable interfeysi Bitta usulni e'lon qiladi - void run () Ushbu turdagi ob'ekt oqim emas. To'g'ridan-to'g'ri tasniflash usulidan foydalanib bo'lmaydi Oqimning tanasini tavsiflovchi va "Thread" dan boshqa sinfdan meros qolgan sinfni yaratish qobiliyati Siz oqim mavzusiga yo'naltirilgan ma'lumotni Thread klassining currentThread () statik usuli yordamida olishingiz mumkin. Runnable interfeysidan foydalanish Sinf tavsifi public class <Имя класса> implements Runnable { public void run() { // Действия, выполняемые потоком } } Oqim boshlanishi Runnable r = new <Имя класса>(); Thread t = new Thread(r); t.start(); Runnable bilan ishlashga namuna Sinf tavsifi public class MyRunnable implements Runnable { public void run() { long sum = 0; for (int i = 0; i < 1000000; i++) { sum += i; } System.out.println(sum); } } Oqim boshlanishi Thread t = new Thread(new MyRunnable()); t.start(); // 499999500000 Oqimni boshqarish void start () oqimning bajarilishini boshlaydi void stop () oqimning bajarilishini to'xtatadi void suspend () oqimlarning bajarilishini to'xtatib turadi void resume () oqimning bajarilishini davom ettiradi void join () usuli ishga tushirilgan oqimning oxirigacha joriy oqimning bajarilishini to'xtatadi statik bo'shliq uyqusi (uzun millis) kamida joriy millisekund uchun joriy oqimning bajarilishini to'xtatadi statik void rentabellik () joriy ipning bajarilishini to'xtatib qo'yadi, boshqa oqimlarni bajarish qobiliyatini ta'minlaydi. Guruh oqimlari (ThreadGroup) Har bir oqim bir guruhda. Oqim guruhlari daraxtni hosil qiladi, ildiz guruhi - ildiz Oqim ota-onalar guruhiga kira olmaydi Guruhning parametrlari va holatini o'zgartirish uning barcha oqimlariga ta'sir qiladi.
Guruhlarni yaratish //ona guruhini ko’rsatmasdan
//ona guruhini ko’rsatib ThreadGroup group2 = new ThreadGroup(group1, "Group2"); Oqimni yaratish //guruhni ko’rsatmasdan
// guruhini ko’rsatib MyThread t = new MyThread(group2, "Thread2"); Oqim guruhidagi operatsiyalar int activCount () oqimlar sonini qaytaradi int enumerate (Thread [] ro'yxati) Aktiv oqimlarni massivga nusxalash int activGroupCount () pastki guruhlar sonini hisoblashni qaytaradi int enumerate (ThreadGroup [] ro'yxati) Aktiv kichik guruhlarni qatorga ko'chiradi void interrupt () Guruhdagi barcha mavzularning bajarilishini to'xtatadi. Oqim ustuvorliklari Ustuvorlik - oqimning ahamiyatini miqdoriy o'lchov. Tizimni tartibga solish tartibiga aniq ta'sir ko'rsatmaydi Dasturning asosiy algoritmi oqimlarni ustuvorlashtirish sxemasiga bog'liq bo'lmasligi kerak Ustuvor qiymatlarni belgilashda konstantalarni ishlatish tavsiya etiladi O’zgarmaslar static int MAX_PRIORITY static int MIN_PRIORITY static int NORM_PRIORITY Oqim usullari int getPriority() void setPriority(int newPriority) Guruh oqimlari usullari int getMaxPriority() void setMaxPriority(int priority) public class MyThread extends Thread { public void run() { long sum = 0; for (int i = 0; i < 1000000; i++) { if (i % 1000 == 0) {System.out.println(getName() + ": " + i/1000);} } } } Thread t1 = new MyThread(); t1.setPriority(Thread.MIN_PRIORITY); t1.start(); Thread t2 = new MyThread(); t2.setPriority(Thread.MAX_PRIORITY); t2.start(); Thread-0: 0 Thread-1: 0 Thread-1: 1 Thread-0: 1 Thread-1: 2 Thread-0: 2 Thread-1: 3 Thread-0: 3 Thread-1: 4 Thread-0: 4 Thread-1: 5 Thread-0: 5 Thread-1: 6 Thread-0: 6 Thread-1: 7 Thread-0: 0 Thread-0: 1 Thread-1: 0 Thread-0: 2 Thread-1: 1 Thread-0: 3 Thread-1: 2 Thread-0: 4 Thread-1: 3 Thread-0: 5 Thread-1: 4 Thread-1: 5 Thread-1: 6 Thread-1: 7 Thread-1: 8 Demon oqimlari (Daemons) Daemon oqimlari sizga asosiy ijro etaklariga xizmat qilish uchun kerak bo'lgan va ularsiz mavjud bo'lmaydigan fon jarayonlarini tasvirlashga imkon beradi Guruhda hech qanday to'siqsiz oqimlar qolmasa, virtual mashina tomonidan yo'q qilinadi void setDaemon (boolean yoqilgan) oqim ko'rinishini sozlaydi. Mavzu boshlanishidan oldin qo'ng'iroq. boolean isDaemon () Oqim turini qaytaradi: true - demon, false – normal
Uning oxirgi oqimi to'xtatilganda yoki oqimlarning oxirgi kichik guruhi yo'q qilinganida demon guruhi avtomatik ravishda yo'q qilinadi void setDaemon (boolean yoq) Guruh ko'rinishini o'rnatadi boolean isDaemon () guruh turini qaytaradi: true - demon, false – normal Nazorat qilinmagan manbalarni ulashish Dasturning aniqlanmaganligi Dasturning yakuniy natijasini oldindan aytib bo'lmaydi Dasturning noto'g'ri ishlashi, algoritmning noto'g'ri ishlashi, favqulodda vaziyatlarning paydo bo'lishi.
Bir vaqtning o'zida faqat bitta oqim ba'zi bir ob'ektni qulflashi mumkin Qulflangan ob'ektni blokirovka qilishga urinish, ushbu ob'ekt qulflanmaguncha oqimning to'xtatilishiga olib keladi Qulfning mavjudligi ob'ekt bilan bog'liq barcha harakatlarga taqiq bermaydi.
Oqim 2 Oqim 3 Bloklaydi Ishlaydi Blokdan oladi Объеkt Blokni ochishga harakat qiladi Kutadi Bloklaydi Ishlaydi Sinxronlash Sinxronlangan blok //Блокируется указанный объект synchronized (<Ссылка на объект>) { <Тело блока синхронизации> } Sinxronlangan usul //Блокируется объект-владелец метода public synchronized void <Имя метода>() { <Тело метода> } Odatdagi xatolar Sinxronizatsiya yetishmasligi Obyektlarni uzoq muddatli asossiz blokirovka qilish O’zaro bloklash (deadlock) Eksklyuziv(ko’p oqimli) oqimlarning paydo bo'lishi Hususiyatlarni ratsional bo’linmasligi Sinf o Object ning maxsus usullari Har bir ob'ektda kutish oqimlari to'plami mavjud (kutish). Har qanday oqim istalgan ob'ektning kutish () usuliga qo'ng'iroq qilishi va u uyg'onguncha to'xtab, kutish rejimiga kirishi mumkin Ob'ektning xabar berish () usuli ob'ektni kutish to'plamidan tasodifiy tanlangan bitta oqimni uyg'otadi Ob'ektning notifyAll () usuli ob'ektni kutish to'plamidagi barcha oqimlarni uyg'otadi
Usulni ob'ektga oqim orqali qo'ng'iroq qilish mumkin, faqat ushbu ob'ektda qulf o'rnatilgandan so'ng Mavzular, kutish () usulini chaqirganingizdan keyin bajarishni to'xtatmasdan oldin, ularning barcha qulflarini bo'shating Bo'shatish usulini chaqirgandan so'ng, oqimlar ilgari chiqarilgan qulflarni tiklashga harakat qilishadi. Oqimlar bo'yicha taqiqlangan harakatlar Mavzu.suspend (), mavzuga oid Buzilishlar sonini ko'paytiradi Thread.stop () Foydalanish buzilgan narsalarga olib keladi
public void interrupt () oqim holatini to'xtatilgan holda o'zgartiradi public static boolean interrupted () Qaytish va oqim holatini tozalash (to'xtatilgan yoki yo'q) public boolean isInterrupted () Oqim holatini qaytaradi (uzilgan yoki yo'q) Oqim ish paytida uning holatini tekshirishi kerak va agar u uzilib qolsa to'g'ri yopilishi kerak.
Agar hozirgi vaqtda kutish (), uxlash (), qo'shilish () usullari bajarilayotgan bo'lsa va u interrupt () usulini chaqirib to'xtatilsa ... usul InterruptedException otish bilan tugaydi! Oqim uzilib qolganligi haqida xabar berilmagan Bog’lovchi ob'ekt kodiga namuna public class Keeper { private Object data; private boolean gettingData = false; synchronized public void putData(Object obj) try { while(gettingData) wait(); data = obj; gettingData = true; notifyAll(); } catch(InterruptedException e) { Thread.currentThread().interrupt(); } } ... ... synchronized public Object getData() throws InterruptedException { while(!gettingData) wait(); gettingData = false; notifyAll(); return data; } } Kutish wait() va uxlash sleep() o'rtasidagi farqlar kutish wait () ob'ektning oqimi tomonidan chaqiriladi, sleep () esa oqim bilan chaqiriladi kutish wait ()oqimini notifyAll () yoki notify () usullari bilan boshlash mumkin va "uxlab yotgan" ipni "uyg'otib bo'lmaydi" Kutish wait () sinxron kontekstdan chaqiriladi, lekin uxlash uchun sleep () bu kerak emas kutish wait () odatda oqim oqim ob'ektga qulfni bo'shatish sharti bilan chaqiriladi. Foydalanilgan manbalar Арнолд, К. Язык программирования Java [Текст] / Кен Арнолд, Джеймс Гослинг, Дэвид Холмс. – М. : Издательский дом «Вильямс», 2001. – 624 с. Вязовик, Н.А. Программирование на Java. Курс лекций [Текст] / Н.А. Вязовик. – М. : Интернет-университет информационных технологий, 2003. – 592 с. Хорстманн, К. Java 2. Библиотека профессионала. Том 2. Тонкости программирования [Текст] / Кей Хорстманн, Гари Корнелл. – М. : Издательский дом «Вильямс», 2010 г. – 992 с. Эккель, Б. Философия Java [Текст] / Брюс Эккель. – СПб. : Питер, 2011. – 640 с. JavaSE at a Glance [Электронный ресурс]. – Режим доступа: http://www.oracle.com/technetwork/java/javase/overview/index.html, дата доступа: 21.10.2011. JavaSE APIs & Documentation [Электронный ресурс]. – Режим доступа: http://www.oracle.com/technetwork/java/javase/documentation/api-jsp-136079.html, дата доступа: 21.10.2011. Download 57.94 Kb. Do'stlaringiz bilan baham: |
ma'muriyatiga murojaat qiling