JavaRush /Java Blog /Random-ID /Hargai waktu dengan streaming
Andrei
Level 2

Hargai waktu dengan streaming

Dipublikasikan di grup Random-ID

Kata pengantar. Paman Petya

Jadi, misalkan kita ingin mengisi sebotol air. Tersedia sebotol dan keran air Paman Petya. Paman Petya memasang keran baru hari ini, dan dia terus memuji keindahannya. Sebelumnya, dia hanya menggunakan keran tua yang tersumbat, sehingga garis-garis di pembotolan sangat besar. Setelah meraba-raba sebentar, terdengar suara pengisian air dari arah tumpah, setelah 2 menit botol masih dalam tahap pengisian, antrian yang biasa sudah berkumpul di belakang kami, dan gambaran di kepalaku betapa perhatiannya Paman. Petya hanya memilih molekul H2O terbaik ke dalam botol kami. Paman Petya, yang dilatih oleh kehidupan, menenangkan orang-orang yang sangat agresif dan berjanji untuk menyelesaikannya secepat mungkin. Setelah selesai dengan botolnya, dia mengambil botol berikutnya dan menyalakan tekanan biasa, yang tidak mengungkapkan semua kemampuan keran baru. Masyarakat tidak bahagia... Menghargai waktu dengan sungai - 1

Teori

Multithreading adalah kemampuan platform untuk membuat banyak thread dalam satu proses. Membuat dan menjalankan thread jauh lebih sederhana daripada membuat proses, jadi jika perlu mengimplementasikan beberapa tindakan paralel dalam satu program, thread tambahan digunakan. Di JVM, program apa pun berjalan di thread utama, dan sisanya diluncurkan dari thread tersebut. Dalam proses yang sama, thread dapat bertukar data satu sama lain. Saat memulai thread baru, Anda dapat mendeklarasikannya sebagai thread pengguna menggunakan metode ini
setDaemon(true);
thread tersebut akan otomatis berakhir jika tidak ada thread lain yang berjalan tersisa. Thread memiliki prioritas kerja (pemilihan prioritas tidak menjamin bahwa thread dengan prioritas tertinggi akan selesai lebih cepat daripada thread dengan prioritas lebih rendah).
  • MIN_PRIORITAS
  • NORM_PRIORITAS (bawaan)
  • MAX_PRIORITAS
Metode dasar saat bekerja dengan aliran:
  • run()– mengeksekusi thread
  • start()– memulai thread
  • getName()– mengembalikan nama thread
  • setName()– menentukan nama aliran
  • wait()– metode yang diwarisi, thread menunggu metode dipanggil notify()dari thread lain
  • notify()– metode yang diwarisi, melanjutkan thread yang sebelumnya dihentikan
  • notifyAll()– metode yang diwariskan, melanjutkan thread yang sebelumnya dihentikan
  • sleep()– menjeda streaming untuk waktu tertentu
  • join()– menunggu thread selesai
  • interrupt()– mengganggu eksekusi thread
Metode lainnya dapat ditemukan di sini. Saatnya memikirkan thread baru jika program Anda memiliki:
  • Akses jaringan
  • Akses sistem file
  • GUI

Kelas benang

Thread di Java direpresentasikan sebagai kelas Threaddan turunannya. Contoh di bawah ini adalah implementasi sederhana dari kelas stream.
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("Новый поток");
    }
}
Hasilnya kita dapatkan
Основной поток
Новый поток
Di sini kita membuat kelas kita dan menjadikannya turunan dari kelas tersebut Thread, setelah itu kita menulis metode main() untuk meluncurkan thread utama dan mengganti metode run()kelas Thread. Sekarang, setelah membuat sebuah instance dari kelas kita dan mengeksekusi metode warisannya, start()kita akan meluncurkan thread baru di mana segala sesuatu yang dijelaskan dalam isi metode akan dieksekusi run(). Kedengarannya rumit, tetapi melihat kode contoh semuanya harusnya jelas.

Antarmuka yang Dapat Dijalankan

Oracle juga menyarankan penerapan antarmuka untuk memulai thread baru Runnable, yang memberi kita lebih banyak fleksibilitas desain daripada satu-satunya warisan yang tersedia pada contoh sebelumnya (jika Anda melihat sumber kelas, ThreadAnda dapat melihat bahwa ia juga mengimplementasikan antarmuka Runnable). Mari gunakan metode yang disarankan untuk membuat thread baru.
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("Новый поток");
    }
}
Hasilnya kita dapatkan
Основной поток
Новый поток
Contohnya sangat mirip, karena Saat menulis kode, kami harus menerapkan metode abstrak run()yang dijelaskan di antarmuka Runnable. Meluncurkan thread baru sedikit berbeda. Kami membuat instance kelas Threaddengan meneruskan referensi ke instance implementasi antarmuka kami sebagai parameter Runnable. Pendekatan inilah yang memungkinkan Anda membuat thread baru tanpa mewarisi kelas secara langsung Thread.

Operasi yang panjang

Contoh berikut dengan jelas akan menunjukkan manfaat menggunakan banyak thread. Katakanlah kita memiliki tugas sederhana yang memerlukan beberapa perhitungan panjang, sebelum artikel ini kita akan menyelesaikannya dalam suatu metode, main()mungkin memecahnya menjadi beberapa metode terpisah untuk kemudahan persepsi, bahkan mungkin kelas, tetapi intinya akan sama. Semua operasi akan dilakukan secara berurutan satu demi satu. Mari kita simulasikan penghitungan skala besar dan ukur waktu pelaksanaannya.
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 + " миллисекунд");
    }
}
Hasilnya kita dapatkan
complete 1
complete 2
complete 3
программа выполнялась 9885 миллисекунд
Waktu eksekusi menyisakan banyak hal yang diinginkan, dan selama ini kami melihat layar keluaran kosong, dan situasinya sangat mirip dengan cerita tentang Paman Petya, hanya saja sekarang kami, para pengembang, belum memanfaatkan perannya. semua kemampuan perangkat modern. Kami akan meningkatkannya.
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);
    }
}
Hasilnya kita dapatkan
complete 1
complete 2
complete 3
программа выполнялась 3466 миллисекунд
Waktu berjalan telah berkurang secara signifikan (efek ini mungkin tidak tercapai atau bahkan dapat menambah waktu eksekusi pada prosesor yang tidak mendukung multithreading). Perlu dicatat bahwa thread mungkin berakhir tidak berurutan, dan jika pengembang memerlukan tindakan yang dapat diprediksi, ia harus mengimplementasikannya secara independen untuk kasus tertentu.

Grup benang

Utas di Java dapat digabungkan menjadi beberapa kelompok; kelas digunakan untuk ini ThreadGroup. Grup dapat mencakup rangkaian pesan tunggal dan seluruh grup. Hal ini dapat berguna jika Anda perlu menghentikan aliran yang terkait, misalnya, dengan jaringan ketika koneksi terputus. Anda dapat membaca lebih lanjut tentang grup di sini. Saya harap topiknya menjadi lebih jelas bagi Anda dan pengguna Anda akan senang.
Menghargai waktu dengan sungai - 2
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION