Java Academy · Pelajaran

Mencipta Strim Selari

parallel() dan parallelStream()

Pelajaran 1 daripada 413 langkah

Mencipta Strim Selari ialah pelajaran Java Academy percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Java Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Java Academy merangkumi sejumlah 4 pelajaran.

Cara Strim Selari Berfungsi

Strim selari membahagikan datanya dan memproses bahagian-bahagian tersebut pada berbilang utas, kemudian menggabungkan hasilnya. Matlamatnya ialah meningkatkan daya pemprosesan untuk beban kerja yang besar.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        int sum = IntStream.rangeClosed(1, 1000)
            .parallel()
            .sum();
        System.out.println(sum);
    }
}

parallel() pada Strim Sedia Ada

Memanggil parallel() menukar strim berjujukan menjadi strim selari. Ia boleh muncul di mana-mana dalam saluran pemprosesan.

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> nums = List.of(1, 2, 3, 4, 5);
        int total = nums.stream()
            .parallel()
            .mapToInt(Integer::intValue)
            .sum();
        System.out.println(total);
    }
}

parallelStream() pada Koleksi

Collection.parallelStream() mencipta strim selari secara terus, sebagai jalan pintas kepada stream().parallel().

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> words = List.of("a", "bb", "ccc");
        int chars = words.parallelStream()
            .mapToInt(String::length)
            .sum();
        System.out.println(chars);
    }
}

Kembali kepada Pelaksanaan Berjujukan

sequential() mengembalikan strim kepada pelaksanaan satu utas. Panggilan terakhir kepada parallel() atau sequential() menentukan keseluruhan saluran pemprosesan.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        int sum = IntStream.rangeClosed(1, 100)
            .parallel()
            .sequential()
            .sum();
        System.out.println(sum);
    }
}

Menyemak isParallel

isParallel() melaporkan sama ada strim akan dilaksanakan secara selari.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        System.out.println(IntStream.range(0, 10).isParallel());
        System.out.println(IntStream.range(0, 10).parallel().isParallel());
    }
}

Hasil Sama, Pelaksanaan Berbeza

Untuk operasi asosiatif seperti sum, strim selari dan berjujukan mengembalikan hasil yang sama. Hanya strategi pelaksanaannya yang berbeza.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        int seq = IntStream.rangeClosed(1, 50).sum();
        int par = IntStream.rangeClosed(1, 50).parallel().sum();
        System.out.println(seq == par);
    }
}

ForkJoinPool Sejagat

Strim selari menggunakan ForkJoinPool.commonPool() yang dikongsi. Saiz lalainya ialah bilangan pemproses yang tersedia ditolak satu.

public class Main {
    public static void main(String[] args) {
        System.out.println(Runtime.getRuntime().availableProcessors());
    }
}

Urutan Utas Tidak Dijamin

Dengan forEach, strim selari mungkin mencetak dalam sebarang susunan kerana bahagian-bahagian tersebut selesai pada masa yang berbeza. Gunakan forEachOrdered jika susunan penting.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        IntStream.rangeClosed(1, 5)
            .parallel()
            .forEachOrdered(System.out::println);
    }
}

Pengurangan Menggabungkan Hasil Separa

Di sebalik tabir, pengurangan selari mengira hasil separa bagi setiap bahagian dan menggabungkannya dengan penggabung. Operasi tersebut mestilah asosiatif untuk memastikan ketepatan.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        int product = IntStream.rangeClosed(1, 6)
            .parallel()
            .reduce(1, (a, b) -> a * b);
        System.out.println(product);
    }
}

Mengumpul secara Selari

Rangka kerja pengumpul menyokong pengumpulan selari dengan menggabungkan bekas separa. groupingBy berfungsi dengan betul secara selari.

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<String> words = List.of("apple", "banana", "avocado", "cherry");
        Map<Character, List<String>> byFirst = words.parallelStream()
            .collect(Collectors.groupingBy(w -> w.charAt(0)));
        System.out.println(byFirst);
    }
}

Tidak Semua Strim Menjadi Lebih Laju

Mengaktifkan keselarian adalah mudah, tetapi tidak semestinya bermanfaat. Set data kecil atau operasi ringan boleh menjadi lebih perlahan secara selari kerana overhed pembahagian dan penggabungan.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        long count = IntStream.rangeClosed(1, 10)
            .parallel()
            .filter(n -> n % 2 == 0)
            .count();
        System.out.println(count);
    }
}

Semakan Pantas

Kolam utas manakah yang melaksanakan strim selari secara lalai?

Imbas Kembali

Anda telah mencipta strim selari:

  • parallel() menukar mana-mana strim; parallelStream() ialah jalan pintas untuk koleksi.
  • sequential() mengembalikannya kepada pelaksanaan berjujukan; panggilan terakhir menentukan hasilnya.
  • Strim tersebut berjalan pada ForkJoinPool.commonPool() yang dikongsi.
  • Hasilnya sepadan dengan pelaksanaan berjujukan untuk operasi asosiatif, tetapi susunan dan kelajuan tidak dijamin.
Percuma untuk bermula

Pelajari Java dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
104
Pelajaran
374

Soalan Lazim

Adakah pelajaran “Mencipta Strim Selari” percuma?

Ya — teks penuh “Mencipta Strim Selari” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Java Academy, tingkat taraf kepada CoddyKit PRO. Kursus Java Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Mencipta Strim Selari”?

parallel() dan parallelStream() Anda berlatih Java Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Java Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Java Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.

Berapa lamakah pelajaran “Mencipta Strim Selari” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Java Academy ini?

Ya. Setiap pelajaran Java Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Mencipta Strim Selari
  2. Apabila Keselarian Membantu
  3. Keselamatan Thread dan Kesan Sampingan
  4. Perangkap Lazim
← Kembali ke Java Academy