JavaRush /Java Blog /Random-TL /Multithreading sa Java

Multithreading sa Java

Nai-publish sa grupo

Panimula

Bago matutunan ang tungkol sa mga thread ng Java, tingnan natin ang malapit na hinaharap. Isipin na isinumite mo ang iyong resume at nagkaroon ng panayam. Ikaw at ang ilang dosenang mga kasamahan sa hinaharap ay inimbitahan na magtrabaho sa isang malaking kumpanya ng Software. Sa iba pang mga abala, kailangan mong magsumite ng mga papel na dokumento para sa trabaho sa isang pagod na empleyado ng HR.
Multithreading sa Java - 1
Upang mapabilis ang proseso, ang mga aplikante para sa posisyon ay maaaring hatiin sa dalawang grupo at ipamahagi sa pagitan ng dalawang HR manager (kung mayroon man sa kumpanya). Bilang resulta, pinapabilis namin ang proseso dahil sa parallel na disenyo ng trabaho.
Multithreading sa Java - 2
Kung mayroon lamang isang opisyal ng tauhan sa kumpanya, kailangan mong lumabas kahit papaano. Halimbawa, maaari mong muling hatiin ang lahat sa dalawang grupo, halimbawa, pakikipanayam ang mga batang babae at lalaki.
Multithreading sa Java - 3
O ayon sa isa pang prinsipyo: dahil mas marami ang nasa mababang grupo, dalawang babae ang ipapalit namin sa isang lalaki.
Multithreading sa Java - 4
Ang ganitong paraan ng pag-aayos ng trabaho ay tinatawag na multi-threaded . Ang aming pagod na HR officer ay lumipat sa iba't ibang grupo upang mag-recruit ng susunod na empleyado mula sa kanila. Mayroong labing-isang grupo, at apat na opisyal ng tauhan. Sa kasong ito, ang pagpoproseso ng multithreading ay magaganap nang magkatulad ng ilang HR, na maaaring kunin ang susunod na tao mula sa anumang grupo upang iproseso ang kanyang mga dokumento.

Mga proseso

Ang proseso ( proseso ) sa kasong ito ay ang samahan ng trabaho sa pagtanggap ng dokumento. Sa isang organisasyon, maraming mga proseso ang maaaring makilala: accounting, software development, mga pulong sa mga kliyente, mga pagpapatakbo ng bodega, atbp. Ang mga mapagkukunan ay inilalaan para sa bawat proseso: lugar, mga empleyado para sa pagpapatupad nito. Ang mga proseso ay nakahiwalay sa isa't isa: Ang mga opisyal ng HR ay walang access sa database ng accounting, at ang mga customer service manager ay hindi tumatakbo sa paligid ng warehouse. Kung ang isang proseso ay kailangang makakuha ng access sa mga mapagkukunan ng ibang tao, kinakailangan na magtatag ng inter-process na komunikasyon: mga memo, magkasanib na pagpupulong.

Batis

Ang gawain sa isang proseso ay isinaayos sa mga thread ( java thread). Para sa departamento ng HR, ang daloy ay ang organisasyon ng trabaho upang maglingkod sa isang grupo. Sa pinakaunang larawan ay may isang daloy, sa susunod na tatlo ay may dalawa. Sa loob ng proseso, ang mga thread ay maaaring isagawa nang magkatulad - dalawang opisyal ng HR ang tumatanggap ng dalawa o higit pang grupo ng mga empleyado sa hinaharap. Ang pakikipag-ugnayan ng mga opisyal ng tauhan sa mga grupo - ang pagproseso ng mga thread sa loob ng isang proseso - ay tinatawag na thread synchronization . Ang mga guhit ng disenyo ng dalawang grupo ng isang opisyal ng tauhan ay nagpapakita ng mga pamamaraan: uniporme (babae - lalaki - babae - lalaki) at may iba't ibang mga priyoridad (dalawang babae na kahalili sa isang lalaki). Ang mga thread ay may access sa mga mapagkukunan ng proseso kung saan sila nabibilang: ang mga grupo sa HR officer ay binibigyan ng mga sample ng mga form ng aplikasyon, mga panulat para sa pagpuno ng mga dokumento. Ngunit kung ang mga daloy ay nakikipag-ugnayan sa mga bagay na karaniwan sa kanila, posible ang mga insidente. Kung hilingin sa iyo ng opisyal ng tauhan na isigaw ang pangalan ng huling tao sa pila, kung gayon, sa kaso ng dalawang grupo, hindi siya sigurado nang maaga kung maririnig niya ang pangalan ng babae o ng lalaki. Ang ganitong mga salungatan sa pag-access ng data, pagharang at mga paraan upang malutas ang mga ito ay isang napakahalagang paksa.

Mga estado ng daloy

Ang bawat thread ay nasa isa sa mga sumusunod na estado:
  • Nilikha ( New) – ang linya para sa HR officer ay naghahanda, ang mga tao ay nagiging organisado.
  • Inilunsad ( Runnable) – ang aming pila ay nakapila para sa HR officer at pinoproseso.
  • Naka-block ( Blocked) – ang huling binata sa pila ay sinubukang sumigaw ng isang pangalan, ngunit nang marinig niya na ang batang babae sa susunod na grupo ay nagsimulang gawin ito sa harap niya, siya ay tumahimik.
  • Completed ( Terminated) - ang buong pila ay nakumpleto na ng HR officer at hindi na ito kailangan.
  • Waiting( Waiting) – isang pila ang naghihintay ng signal mula sa isa pa.
Ang organisasyon ng mga thread at ang kanilang pakikipag-ugnayan ay ang batayan para sa epektibong operasyon ng mga proseso.

Bumalik tayo sa mundo ng IT

Sa ika-21 siglo, ang multi-threaded at parallel execution ay naging may kaugnayan. Mula noong 90s ng huling siglo, ang mga multitasking operating system na Windows, MacOS at Linux ay naging matatag sa mga home computer. Madalas kang makakahanap ng apat o higit pang mga pangunahing processor sa kanila. Ang bilang ng mga parallel block ng GPU video card ay lumampas na sa isang libo. Ang mga sikat na programa ay isinulat na isinasaalang-alang ang multithreading (multithreading), halimbawa, mga modernong bersyon ng software para sa pagproseso ng mga graphics, video, o pagpapatakbo na may malaking halaga ng data: Adobe Photoshop, WinRar, Mathematica, mga modernong laro. Ang Java multithreading ay isang napakahalaga, sikat at kumplikadong paksa. Samakatuwid, sa kursong JavaRush mayroong maraming mga gawain upang maunawaan ito nang mabuti. Ang mga halimbawa ng Java sa multithreading ay makakatulong sa iyo na makabisado ang mga pangunahing nuances at subtleties ng lugar na ito, pag-synchronize ng gawain ng mga thread.

Proseso

Ang proseso ay isang tumatakbong halimbawa ng isang programa kung saan ang Operating System (OS) ay naglaan ng memorya, oras/mga core ng processor, at iba pang mapagkukunan. Mahalaga na ang memorya ay inilalaan nang hiwalay; ang mga puwang ng address ng iba't ibang mga proseso ay hindi naa-access sa bawat isa. Kung kailangang makipag-usap ang mga proseso, magagawa nila ito gamit ang mga file, pipe, at iba pang paraan ng komunikasyon sa interprocess.

Daloy

Java Thread(stream). Minsan, upang maiwasan ang pagkalito sa iba pang mga klase ng Java Streamat mga katulad nito, ang mga thread ng Java ay kadalasang isinasalin bilang isang thread. Ginagamit nila ang mga mapagkukunang inilalaan sa isang proseso at ang paraan ng pagsasagawa ng proseso. Ang pangunahing thread ay nagpapatupad ng pamamaraan mainat lumabas. Kapag ang isang proseso ay naisakatuparan, ang mga karagdagang thread (mga bata na thread) ay maaaring i-spawn. Ang mga thread ng parehong proseso ay maaaring makipagpalitan ng data sa bawat isa. Ang multithreading ng Java ay nangangailangan ng pag-synchronize ng data upang isaalang-alang, huwag kalimutan ang tungkol dito. Sa Java, magtatapos ang isang proseso kapag natapos na ang huling thread nito. Para sa mga gawain sa background, ang isang thread ay maaaring simulan bilang isang daemon ( daemon), ang pagkakaiba sa isang regular ay ang mga ito ay sapilitang wawakasan kapag ang lahat ng hindi mga daemonthread ng proseso ay natapos.

Unang multi-threaded na application

Mayroong higit sa kalahating dosenang mga paraan upang lumikha ng mga thread; sa kursong JavaRush susuriin namin ang mga ito nang detalyado. Una, kilalanin natin ang isa sa mga pangunahing. Mayroong isang espesyal na klase Threadsa paraan run()kung saan kailangan mong magsulat ng code na nagpapatupad ng logic ng programa. Pagkatapos gumawa ng thread, maaari mo itong simulan sa pamamagitan ng pagtawag sa start(). Sumulat tayo ng demo program na nagpapatupad ng halimbawa ng 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(); //Запускаем вторую (дочерний поток)
    }
}
Ilunsad natin ang programa. Ipinapakita ng console ang output ng mensahe mula sa pangunahing thread. Susunod, ang bawat thread ng bata queue1ay queue2naglalabas naman ng mga mensahe sa kanilang karaniwang console tungkol sa susunod na naprosesong empleyado. Isa sa mga posibleng opsyon para sa programa:
Начали!
Обработаны documentы: Мария
Обработаны documentы: Ivan
Обработаны documentы: Людмила
Обработаны documentы: Сергей
Обработаны documentы: Алиса
Обработаны documentы: Николай
Обработаны documentы: Карина
Обработаны documentы: Фердинанд
Обработаны documentы: Ольга
Обработаны documentы: Васorй

Process finished with exit code 0
Ang multithreading sa Java ay isang kumplikado at multifaceted na paksa. Ang kakayahang magsulat ng code gamit ang parallel, multitasking at multithreaded computing ay makakatulong sa iyong epektibong ipatupad ang mga gawain sa mga modernong multi-core na processor at cluster na binubuo ng maraming computer.
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION