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."
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(); // Уведомляем производителей о свободном месте } } }
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.
Santa menyedari bahawa bunian sering terlupa untuk menghubungi notifyAll, dan ini menyebabkan kelewatan. Kemudian dia menggunakan alat ajaib - BlockingQueue, yang dengan sendirinya menjaga benang.
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(); // Уведомляем производителей о свободном месте } } }
Untuk mengelakkan bunian daripada penat, Santa mencipta alat ajaib - kumpulan benang. Kini setiap bunian melaksanakan tugasnya, dan bilangan mereka dikawal secara automatik.
"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); } }
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.
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(); // Завершаем работу после выполнения всех задач } }
Asynchronous: tugasan dilaksanakan dalam urutan latar belakang tanpa menyekat utas utama.
Kemudahan penggunaan: tidak perlu mengurus benang secara manual.
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! ?
Atas ialah kandungan terperinci Perlumbaan Percutian Santa: Keajaiban Java Multithreading. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!