JavaRush /Java Blog /Random-TL /Pinahahalagahan ang oras sa mga stream
Andrei
Antas

Pinahahalagahan ang oras sa mga stream

Nai-publish sa grupo

Paunang Salita. Tiyo Petya

Kaya, sabihin nating gusto naming magpuno ng isang bote ng tubig. Available ang bote at gripo ng tubig ni Uncle Petya. May bagong gripo na na-install ngayon si Tiyo Petya, at patuloy niyang pinupuri ang kagandahan nito. Bago iyon, gumamit lang siya ng luma at barado na gripo, kaya napakalaki ng mga linya sa bottling. Pagkatapos ng kaunting kalmot ay narinig ang tunog ng pagpuno ng tubig mula sa direksyon ng pagtapon, pagkatapos ng 2 minuto ay nasa filling stage pa rin ang bote, ang karaniwang pila ay nagkukumpulan sa likod namin, at ang imahe sa aking isipan ay kung gaano ka-aalaga si Uncle. Pinipili lamang ni Petya ang pinakamahusay na mga molekula ng H2O sa aming bote. Si Uncle Petya, na sinanay ng buhay, ay pinapakalma ang mga lalo na agresibo at nangangako na tapusin nang mabilis hangga't maaari. Nang matapos ang bote, kinuha niya ang susunod at i-on ang karaniwang presyon, na hindi nagpapakita ng lahat ng mga kakayahan ng bagong gripo. Hindi masaya ang mga tao... Pagpapahalaga sa oras sa mga stream - 1

Teorya

Ang multithreading ay ang kakayahan ng isang platform na lumikha ng maramihang mga thread sa loob ng isang proseso. Ang paglikha at pagpapatupad ng isang thread ay mas simple kaysa sa paglikha ng isang proseso, kaya kung kinakailangan upang ipatupad ang ilang mga parallel na aksyon sa isang programa, ang mga karagdagang thread ay ginagamit. Sa JVM, ang anumang programa ay tumatakbo sa pangunahing thread, at ang iba ay inilunsad mula dito. Sa loob ng parehong proseso, ang mga thread ay nakakapagpalitan ng data sa isa't isa. Kapag nagsisimula ng bagong thread, maaari mo itong ideklara bilang thread ng user gamit ang pamamaraan
setDaemon(true);
ang mga naturang thread ay awtomatikong magwawakas kung wala nang iba pang tumatakbong mga thread na natitira. Ang mga thread ay may priyoridad sa trabaho (ang pagpili ng priyoridad ay hindi ginagarantiya na ang pinakamataas na priyoridad na thread ay matatapos nang mas mabilis kaysa sa mas mababang priyoridad na thread).
  • MIN_PRIORITY
  • NORM_PRIORITY (default)
  • MAX_PRIORITY
Mga pangunahing pamamaraan kapag nagtatrabaho sa mga stream:
  • run()– ipapatupad ang thread
  • start()- nagsisimula ng isang thread
  • getName()– ibinabalik ang pangalan ng thread
  • setName()– tumutukoy sa pangalan ng stream
  • wait()– minanang pamamaraan, ang thread ay naghihintay para sa pamamaraan na tawagin notify()mula sa isa pang thread
  • notify()– minanang pamamaraan, ipagpatuloy ang dati nang nahintong thread
  • notifyAll()– minanang pamamaraan, ipagpatuloy ang dating nahintong mga thread
  • sleep()– ipo-pause ang stream para sa isang tinukoy na oras
  • join()– naghihintay na makumpleto ang thread
  • interrupt()– nakakagambala sa pagpapatupad ng thread
Marami pang paraan ang makikita dito. Oras na para mag-isip tungkol sa mga bagong thread kung ang iyong programa ay mayroong:
  • Access sa network
  • Pag-access sa file system
  • GUI

Klase ng thread

Ang mga thread sa Java ay kinakatawan bilang isang klase Threadat mga inapo nito. Ang halimbawa sa ibaba ay isang simpleng pagpapatupad ng stream class.
import static java.lang.System.out;

public class ExampleThread extends Thread{

    public static void main(String[] args) {
        out.println("Основной поток");
        new ExampleThread().start();
    }

    @Override
    public void run() {
        out.println("Новый поток");
    }
}
Bilang resulta nakukuha namin
Основной поток
Новый поток
Dito ginagawa namin ang aming klase at ginagawa itong descendant ng class Thread, pagkatapos ay isinusulat namin ang main() method para ilunsad ang main thread at i-override ang run()class method Thread. Ngayon, na nakalikha ng isang instance ng aming klase at naisakatuparan ang minanang pamamaraan nito, start()maglulunsad kami ng bagong thread kung saan ang lahat ng inilarawan sa katawan ng pamamaraan ay isasagawa run(). Mukhang kumplikado, ngunit ang pagtingin sa halimbawang code ay dapat na malinaw ang lahat.

Runnable na Interface

Iminumungkahi din ng Oracle na ipatupad ang interface upang magsimula ng bagong thread Runnable, na nagbibigay sa amin ng higit na kakayahang umangkop sa disenyo kaysa sa tanging magagamit na mana sa nakaraang halimbawa (kung titingnan mo ang pinagmulan ng klase Threadmakikita mo na ipinapatupad din nito ang interface Runnable). Gamitin natin ang inirerekomendang paraan para sa paggawa ng bagong thread.
import static java.lang.System.out;

public class ExampleRunnable implements Runnable {

    public static void main(String[] args) {
        out.println("Основной поток");
        new Thread(new ExampleRunnable()).start();
    }

    @Override
    public void run() {
        out.println("Новый поток");
    }
}
Bilang resulta nakukuha namin
Основной поток
Новый поток
Ang mga halimbawa ay halos magkatulad, dahil Kapag isinusulat ang code, kailangan naming magpatupad ng abstract na pamamaraan run()na inilarawan sa interface Runnable. Ang paglulunsad ng bagong thread ay medyo naiiba. Gumawa kami ng isang instance ng klase Threadsa pamamagitan ng pagpasa ng reference sa isang instance ng aming pagpapatupad ng interface bilang isang parameter Runnable. Ito ang pamamaraang ito na nagpapahintulot sa iyo na lumikha ng mga bagong thread nang hindi direktang namamana ang klase Thread.

Mahabang operasyon

Ang sumusunod na halimbawa ay malinaw na magpapakita ng mga benepisyo ng paggamit ng maramihang mga thread. Sabihin nating mayroon tayong isang simpleng gawain na nangangailangan ng ilang mahahabang kalkulasyon, bago ang artikulong ito ay malulutas natin ito sa isang pamamaraan, main()marahil ay hatiin ito sa magkakahiwalay na mga pamamaraan para sa kadalian ng pang-unawa, marahil kahit na mga klase, ngunit ang kakanyahan ay magiging pareho. Ang lahat ng mga operasyon ay isasagawa nang sunud-sunod. Gayahin natin ang mga kalkulasyon ng mabibigat na timbang at sukatin ang oras ng kanilang pagpapatupad.
public class ComputeClass {

    public static void main(String[] args) {
        // Узнаем стартовое время программы
        long startTime = System.currentTimeMillis();

        // Определяем долгосрочные операции
        for(double i = 0; i < 999999999; i++){
        }
        System.out.println("complete 1");
        for(double i = 0; i < 999999999; i++){
        }
        System.out.println("complete 2");
        for(double i = 0; i < 999999999; i++){
        }
        System.out.println("complete 3");

        //Вычисляем и выводим время выполнения программы
        long timeSpent = System.currentTimeMillis() - startTime;
        System.out.println("программа выполнялась " + timeSpent + " миллисекунд");
    }
}
Bilang resulta nakukuha namin
complete 1
complete 2
complete 3
программа выполнялась 9885 миллисекунд
Ang oras ng pagpapatupad ay nag-iiwan ng maraming nais, at sa lahat ng oras na ito ay tumitingin kami sa isang blangko na screen ng output, at ang sitwasyon ay halos kapareho sa kuwento tungkol kay Uncle Petya, ngayon lamang sa kanyang tungkulin kami, ang mga developer, ay hindi sinamantala. lahat ng mga kakayahan ng mga modernong kagamitan. Pagbubutihin natin.
public class ComputeClass {

    public static void main(String[] args) {
        // Узнаем стартовое время программы
        long startTime = System.currentTimeMillis();

        // Определяем долгосрочные операции
        new MyThread(1).start();
        new MyThread(2).start();
        for(double i = 0; i < 999999999; i++){
        }
        System.out.println("complete 3");

        //Вычисляем и выводим время выполнения программы
        long timeSpent = System.currentTimeMillis() - startTime;
        System.out.println("программа выполнялась " + timeSpent + " миллисекунд");
    }
}

class MyThread extends Thread{
int n;

MyThread(int n){
    this.n = n;
}

    @Override
    public void run() {
        for(double i = 0; i < 999999999; i++){
        }
        System.out.println("complete " + n);
    }
}
Bilang resulta nakukuha namin
complete 1
complete 2
complete 3
программа выполнялась 3466 миллисекунд
Ang oras ng pagpapatakbo ay makabuluhang nabawasan (ang epektong ito ay maaaring hindi makamit o maaari pang tumaas ang oras ng pagpapatupad sa mga processor na hindi sumusuporta sa multithreading). Ito ay nagkakahalaga ng pagpuna na ang mga thread ay maaaring magwakas nang hindi maayos, at kung ang developer ay nangangailangan ng predictability ng mga aksyon, dapat niyang ipatupad ito nang nakapag-iisa para sa isang partikular na kaso.

Mga pangkat ng thread

Ang mga thread sa Java ay maaaring pagsamahin sa mga pangkat; ang klase ay ginagamit para dito ThreadGroup. Ang mga grupo ay maaaring magsama ng mga solong thread at buong grupo. Maaari itong maging maginhawa kung kailangan mong matakpan ang mga daloy na nauugnay, halimbawa, sa network kapag nawala ang koneksyon. Maaari kang magbasa ng higit pa tungkol sa mga grupo dito Sana ngayon ay naging mas malinaw na sa iyo ang paksa at magiging masaya ang iyong mga gumagamit.
Pagpapahalaga sa oras sa mga stream - 2
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION