JavaRush /Java блогу /Random-KY /Java тилинде көп агым

Java тилинде көп агым

Группада жарыяланган

Киришүү

Java жиптери менен таанышуудан мурун, келгиле, жакынкы келечекти карап көрөлү. Өзүңүздүн резюмеңизди тапшырып, интервью алдыңыз деп элестетиңиз. Сиз жана ондогон келечектеги кесиптештериңиз программалык камсыздоо боюнча ири компанияга иштөөгө чакырылдыңыздар. Башка кыйынчылыктар менен катар, сиз чарчаган HR кызматкерине жумушка орношуу үчүн кагаз documentтерди тапшырышыңыз керек.
Java тorнде көп агым - 1
Процессти тездетүү үчүн, кызматка талапкерлерди эки топко бөлүп, эки HR менеджеринин ортосунда бөлүштүрсө болот (эгер компанияда бар болсо). Натыйжада, параллелдүү долбоорлоо иштеринин эсебинен процессти тездетип жатабыз.
Java тorнде көп агым - 2
Эгерде компанияда бир гана кадр кызматкери болсо, анда кандайдыр бир жол менен чыгууга туура келет. Мисалы, сиз кайрадан баарын эки топко бөлсөңүз болот, мисалы, кезеги менен кыздар менен балдардан интервью алсаңыз болот.
Java тorнде көп агым - 3
Же дагы бир принцип боюнча: төмөнкү тайпада адам көп болгондуктан, бир уулга эки кызды алмаштырабыз.
Java тorнде көп агым - 4
Ишти уюштуруунун мындай ыкмасы көп жиптүү деп аталат . Биздин чарчаган HR кызматкери ар кандай топторго өтүп, алардан кийинки кызматкерди жумушка алат. Мүмкүн он бир топ, төрт кадр кызматкери бар. Бул учурда, көп агымдык иштетүү бир нече HR тарабынан параллелдүү ишке ашат, алар өзүнүн documentтерин иштетүү үчүн каалаган топтон кийинки адамды ала алышат.

Процесстер

Бул учурда процесс ( процесс ) documentтерди кабыл алуу ишин уюштуруу болот. Уюмда бир нече процесстерди айырмалоого болот: бухгалтердик эсеп, программалык камсыздоону иштеп чыгуу, кардарлар менен жолугушуулар, кампа операциялары ж.б. Ар бир процесс үчүн ресурстар бөлүнөт: жайлар, аны аткаруу үчүн кызматкерлер. Процесстер бири-биринен обочолонгон: кадрлар бөлүмүнүн кызматкерлери бухгалтердик эсептин базасына кире алышпайт, кардарларды тейлөө боюнча менеджерлер кампанын айланасында чуркашпайт. Эгерде процесс башка бирөөнүн ресурстарына жетүү үчүн керек болсо, процесстер аралык байланышты түзүү керек: меморандумдар, биргелешкен жолугушуулар.

Агымдар

Процесстеги иш жиптерге уюштурулат ( java thread). Кадрлар бөлүмү үчүн агым – бул топту тейлөө үчүн ишти уюштуруу. Биринчи сүрөттө бир агым, кийинки үчөөдө эки. Процесстин алкагында жиптер параллелдүү түрдө аткарылышы мүмкүн - эки HR кызматкери келечектеги кызматкерлердин эки же андан көп тобун кабыл алат. Кадр кызматкерлеринин топтор менен өз ара аракеттенүүсү - процесстин ичиндеги жиптерди иштетүү - жипти синхрондоштуруу деп аталат . Кадрлар боюнча бир кызматкер тарабынан эки топту долбоорлоонун чиймелери ыкмаларды көрсөтөт: форма (кыз - бала - кыз - бала) жана ар кандай артыкчылыктар менен (эки кыз бир бала менен алмашат). Жиптер алар таандык болгон процесстин ресурстарына жете алышат: кадрлар боюнча кызматкерге топторго анкеталардын үлгүлөрү, documentтерди толтуруу үчүн калемдер берилет. Бирок агымдар алар үчүн жалпы нерселер менен өз ара аракеттенсе, анда инциденттер болушу мүмкүн. Кадр кызматкери кезектеги акыркы адамдын аты-жөнүн кыйкырып коюуну суранса, анда, эки топ болсо, ал аялдын атын же эркектин атын угаарын алдын ала билбейт. Мындай маалыматтарга кирүү чыр-чатактар, бөгөт коюу жана аларды чечүү жолдору абдан маанилүү тема болуп саналат.

Агым абалы

Ар бир жип төмөнкү абалдардын биринде:
  • Түзүлгөн ( New) – кадрлар бөлүмүнүн кызматкери үчүн линия даярдалууда, адамдар уюшулуп жатат.
  • Ишке киргизилди ( Runnable) – биздин кезегибиз HR кызматкери үчүн тизилди жана иштелип жатат.
  • Бөгөттөлдү ( Blocked) – кезекте турган эң акыркы жигит атын айтып кыйкырууга аракет кылат, бирок кийинки топтун кызынын өзүнөн мурун жасай баштаганын угуп, унчукпай калды.
  • Аякталды ( Terminated) - бүткүл кезек кадрлар бөлүмүнүн кызматкери тарабынан толтурулган жана ага муктаждык жок.
  • Waiting( Waiting) – бир кезек экинчисинен сигналды күтүп жатат.
Жиптерди уюштуруу жана алардын өз ара аракеттенүүсү процесстердин эффективдүү иштешинин негизи болуп саналат.

Келгиле, IT дүйнөсүнө кайрылып көрөлү

21-кылымда көп жиптүү жана параллелдүү аткаруу актуалдуу болуп калды. Өткөн кылымдын 90-жылдарынан бери Windows, MacOS жана Linux көп милдеттүү операциялык системалары үй компьютерлеринде бекем орноду. Алардан көбүнчө төрт же андан көп негизги процессорлорду таба аласыз. GPU видеокарталарынын параллелдүү блокторунун саны миңден ашты. Популярдуу программалар multithreading (multithreading) эске алуу менен жазылат, мисалы, графиканы, видеону иштетүү үчүн программалык камсыздоонун заманбап versionлары же чоң көлөмдөгү маалыматтар менен иштөө: Adobe Photoshop, WinRar, Mathematica, заманбап оюндар. Java multithreading абдан маанилүү, популярдуу жана татаал тема. Ошондуктан, JavaRush курсунда аны жакшы түшүнүү үчүн көптөгөн тапшырмалар бар. Көп агым боюнча Java мисалдары жиптердин ишин синхрондоштурууга, бул аймактын негизги нюанстарын жана кылдаттыктарын өздөштүрүүгө жардам берет.

Процесс

Процесс - бул Операция системасы (ОС) эстутум, процессор убактысы/өзөктөрү жана башка ресурстарды бөлгөн программанын иштеп жаткан нускасы. Эстутум өзүнчө бөлүнгөнү маанилүү, ар кандай процесстердин дарек мейкиндиктери бири-бирине жеткorктүү эмес. Эгерде процесстер байланышы керек болсо, алар муну файлдарды, түтүктөрдү жана башка процесстер аралык байланыш ыкмаларын колдонуу менен жасай алышат.

Агым

Java Thread(агым). Кээде, башка Java класстары жана ушул сыяктуулар менен чаташтырбоо үчүн Stream, Java жиптери көбүнчө жип катары которулат. Алар процесске бөлүнгөн ресурстарды колдонушат жана процесстин аткарылышынын жолу. Негизги жип методду аткарат mainжана чыгат. Процесс аткарылганда, кошумча жиптер (бала жиптер) пайда болушу мүмкүн. Бир эле процесстин жиптери бири-бири менен маалымат алмаша алат. Java multithreading маалымат синхрондоштурууну эске алууну талап кылат, бул жөнүндө унутпаңыз. Java-да процесс анын акыркы жип аяктагандан кийин токтойт. Фондук тапшырмалар үчүн жип демон ( daemon) катары башталышы мүмкүн, адаттагыдан айырмасы daemonпроцесстин бардык жиптери жок болгондон кийин алар мажбурлап токтотулат.

Биринчи көп жиптүү колдонмо

Жиптерди түзүүнүн жарым ондон ашык жолдору бар; JavaRush курсунда биз аларды майда-чүйдөсүнө чейин карап чыгабыз. Биринчиден, негизгилеринин бири менен таанышып көрөлү. Программанын логикасын ишке ашырган codeду жазуу керек болгон Threadатайын класс бар . run()Жипти түзгөндөн кийин, сиз аны start(). Келгиле, Java multithreading мисалын ишке ашырган демо программасын жазалы.
class PeopleQueue extends Thread    {// Наша очередь из сотрудников, наследник класса Thread
    private String[] names;

    PeopleQueue(String... names) {// Конструктор, аргумент- массив имен сотрудников
        this.names = names;
    }

    @Override
    public void run() { // Этот метод будет вызван при старте потока
        for (int i = 0; i < names.length; i++) { // Вывод в цикле с паузой 0.5 сек очередного сотрудника
            System.out.println("Обработаны documentы: " + names[i]);
            try {
                sleep(500); // Задержка в 0.5 сек
            } catch (Exception e) {}
        }
    }
}

public class HR    {// Класс для демонстрации работы потока
    public static void main(String[] args) {
        // Создаем две очереди
        PeopleQueue queue1 = new PeopleQueue("Ivan","Сергей","Николай","Фердинанд","Basil");
        PeopleQueue queue2 = new PeopleQueue("Мария","Людмила","Алиса","Карина","Olga");

        System.out.println("Начали!"); // Сообщение из главного потока программы
        queue1.start();    //Запускаем одну очередь (дочерний поток)
        queue2.start(); //Запускаем вторую (дочерний поток)
    }
}
Программаны ишке киргизели. Консол негизги жиптен чыккан билдирүүнү көрсөтөт. Андан кийин, ар бир бала жип өз кезегинде кийинки иштетилген кызматкер жөнүндө жалпы консолуна билдирүүлөрдү чыгарат queue1. queue2Программанын мүмкүн болгон варианттарынын бири:
Начали!
Обработаны documentы: Мария
Обработаны documentы: Ivan
Обработаны documentы: Людмила
Обработаны documentы: Сергей
Обработаны documentы: Алиса
Обработаны documentы: Николай
Обработаны documentы: Карина
Обработаны documentы: Фердинанд
Обработаны documentы: Ольга
Обработаны documentы: Васorй

Process finished with exit code 0
Java тorндеги көп агым татаал жана көп кырдуу тема. Параллелдүү, көп тапшырмалуу жана көп агымдуу эсептөөлөрдү колдонуу менен code жазуу жөндөмү көптөгөн компьютерлерден турган заманбап көп ядролуу процессорлордо жана кластерлерде тапшырмаларды натыйжалуу ишке ашырууга жардам берет.
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION