Rumah > Java > javaTutorial > Perlumbaan Percutian Santa: Keajaiban Java Multithreading

Perlumbaan Percutian Santa: Keajaiban Java Multithreading

Patricia Arquette
Lepaskan: 2025-01-04 09:04:34
asal
591 orang telah melayarinya

Di sebuah kerajaan bersalji yang jauh, tempat salji berkilat seperti berlian dan bintang membisikkan cerita dongeng, Santa sedang bersiap untuk malam yang paling ajaib dalam setahun. Kilangnya berdengung seperti alat muzik gergasi: bunian berlari-lari dengan kotak, mainan berkilauan dengan warna-warna yang berwarna-warni, dan loceng berbunyi dengan setiap hadiah baharu yang siap dibuat.

Tetapi sihir itu terancam.

"Terlalu banyak mainan! Suapan penuh!" — ketua pengeluar bunian mengeluh.
"Kami tidak mempunyai masa untuk mengemas!" - bunian pengemas itu bergema dia.

Santa berfikir: "Bagaimanakah saya boleh membantu bunian saya? Mereka cuba yang terbaik, tetapi mereka tidak boleh melakukannya tanpa sihir."

Sihir Pertama: Penyegerakan

Santa beralih kepada mantera yang dikenali sebagai disegerakkan. Ia mencipta penghalang pelindung supaya bunian tidak berdesak-desakan dan keliru apabila bekerja dengan pita biasa.

"Kini hanya seorang daripada anda boleh meletakkan atau mengambil mainan pada satu masa," jelas Santa.

Beginilah rupanya:

class SantaFactory {
    private final Queue<String> conveyorBelt = new LinkedList<>();
    private final int MAX_CAPACITY = 10;

    public void produce(String toy) throws InterruptedException {
        synchronized (conveyorBelt) {
            while (conveyorBelt.size() == MAX_CAPACITY) {
                System.out.println("Производитель ждёт: лента заполнена!");
                conveyorBelt.wait(); // Производитель ждёт, пока появится место
            }
            conveyorBelt.add(toy);
            System.out.println("Игрушка произведена: " + toy);
            conveyorBelt.notifyAll(); // Уведомляем упаковщиков о новой игрушке
        }
    }

    public void consume() throws InterruptedException {
        synchronized (conveyorBelt) {
            while (conveyorBelt.isEmpty()) {
                System.out.println("Потребитель ждёт: игрушек нет!");
                conveyorBelt.wait(); // Упаковщик ждёт, пока появится игрушка
            }
            String toy = conveyorBelt.poll();
            System.out.println("Игрушка упакована: " + toy);
            conveyorBelt.notifyAll(); // Уведомляем производителей о свободном месте
        }
    }
}

Salin selepas log masuk
Salin selepas log masuk

Sifat ajaib menunggu dan memberitahuSemua:

wait(): Menginapkan benang sehingga keadaan (seperti pita kosong) menjadi palsu.
notifyAll(): Bangunkan semua rangkaian menunggu untuk menyemak sama ada ia boleh diteruskan.

Sihir Kedua: BlockingQueue

Santa menyedari bahawa bunian sering terlupa untuk menghubungi notifyAll, dan ini menyebabkan kelewatan. Kemudian dia menggunakan alat ajaib - BlockingQueue, yang dengan sendirinya menjaga benang.

Праздничные гонки Санты: Волшебство многопоточности Java
BlockingQueue melakukan perkara berikut:

Jika pita penuh, pengilang akan menunggu secara automatik.
Jika pita itu kosong, pembungkus itu sendiri memahami bahawa dia perlu menunggu.

class SantaFactory {
    private final Queue<String> conveyorBelt = new LinkedList<>();
    private final int MAX_CAPACITY = 10;

    public void produce(String toy) throws InterruptedException {
        synchronized (conveyorBelt) {
            while (conveyorBelt.size() == MAX_CAPACITY) {
                System.out.println("Производитель ждёт: лента заполнена!");
                conveyorBelt.wait(); // Производитель ждёт, пока появится место
            }
            conveyorBelt.add(toy);
            System.out.println("Игрушка произведена: " + toy);
            conveyorBelt.notifyAll(); // Уведомляем упаковщиков о новой игрушке
        }
    }

    public void consume() throws InterruptedException {
        synchronized (conveyorBelt) {
            while (conveyorBelt.isEmpty()) {
                System.out.println("Потребитель ждёт: игрушек нет!");
                conveyorBelt.wait(); // Упаковщик ждёт, пока появится игрушка
            }
            String toy = conveyorBelt.poll();
            System.out.println("Игрушка упакована: " + toy);
            conveyorBelt.notifyAll(); // Уведомляем производителей о свободном месте
        }
    }
}

Salin selepas log masuk
Salin selepas log masuk

Sihir Ketiga: Pelaksana dan Kolam Benang

Untuk mengelakkan bunian daripada penat, Santa mencipta alat ajaib - kumpulan benang. Kini setiap bunian melaksanakan tugasnya, dan bilangan mereka dikawal secara automatik.
Праздничные гонки Санты: Волшебство многопоточности Java
"Bunian tidak akan mengejar satu sama lain lagi, semuanya berjalan lancar," Santa bergembira.

Contoh kod:

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

class SantaFactoryBlocking {
    private final BlockingQueue<String> conveyorBelt = new ArrayBlockingQueue<>(10);

    public void produce(String toy) throws InterruptedException {
        conveyorBelt.put(toy); // Если лента заполнена, поток автоматически ждёт
        System.out.println("Игрушка произведена: " + toy);
    }

    public void consume() throws InterruptedException {
        String toy = conveyorBelt.take(); // Если лента пуста, поток автоматически ждёт
        System.out.println("Игрушка упакована: " + toy);
    }
}

Salin selepas log masuk

Sifat ajaib Pelaksana:

newFixedThreadPool(n): Mencipta kumpulan n benang yang akan digunakan semula.
submit(task): Memulakan tugasan dalam salah satu urutan.
shutdown(): Menghentikan pelaksanaan selepas semua tugasan selesai.

Sihir Keempat: CompletableFuture

Праздничные гонки Санты: Волшебство многопоточности Java
Pada peringkat terakhir, Santa menambah sedikit keajaiban tambahan: kini bunian bekerja secara tidak segerak, yang mempercepatkan proses itu.

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class SantaRaceWithExecutors {
    public static void main(String[] args) {
        SantaFactoryBlocking factory = new SantaFactoryBlocking();
        ExecutorService executor = Executors.newFixedThreadPool(4); // 4 эльфа

        // Запускаем 2 производителя
        for (int i = 1; i <= 2; i++) {
            executor.submit(() -> {
                try {
                    for (int j = 1; j <= 20; j++) {
                        factory.produce("Игрушка #" + j);
                        Thread.sleep(100); // Производство занимает время
                    }
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            });
        }

        // Запускаем 2 упаковщика
        for (int i = 1; i <= 2; i++) {
            executor.submit(() -> {
                try {
                    for (int j = 1; j <= 20; j++) {
                        factory.consume();
                        Thread.sleep(150); // Упаковка занимает время
                    }
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            });
        }

        executor.shutdown(); // Завершаем работу после выполнения всех задач
    }
}

Salin selepas log masuk

Sifat ajaib CompletableFuture:

Asynchronous: tugasan dilaksanakan dalam urutan latar belakang tanpa menyekat utas utama.
Kemudahan penggunaan: tidak perlu mengurus benang secara manual.

Tahun Baru diselamatkan!

Apabila mainan terakhir dibungkus, Santa mengeluh kegembiraan. "Bunian, kamu telah melakukan kerja yang luar biasa. Keajaiban multithreading telah menjadikan kami bukan sahaja lebih pantas, tetapi juga lebih gembira!"

Dan kini, setiap malam pada Malam Tahun Baru, Santa memberitahu pembantunya kisah dongeng tentang bagaimana multithreading menyelamatkan percutian itu.

✨ Selamat Tahun Baru, kawan-kawan! ?

Праздничные гонки Санты: Волшебство многопоточности Java

Atas ialah kandungan terperinci Perlumbaan Percutian Santa: Keajaiban Java Multithreading. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan