聖誕老人的節日競賽:Java 多線程的魔力
在遙遠的冰雪王國裡,雪堆像鑽石一樣閃閃發光,星星低語著童話故事,聖誕老人正在為一年中最神奇的夜晚做準備。他的工廠像一架巨大的樂器一樣嗡嗡作響:精靈們拿著盒子跑來跑去,玩具閃閃發光,每一件新的現成禮物都敲響了鈴聲。
但是魔法受到了威脅。
「玩具太多!飼料已滿!」— 精靈首席製作人抱怨道。
「我們沒時間收拾行李!」 - 包裝精靈附和著他。
聖誕老公公想:「我怎麼幫助我的精靈呢?他們已經盡力了,但他們離不開魔法。」
第一個魔法:同步
聖誕老人求助於一種名為「同步」的咒語。它創造了一個保護屏障,讓精靈們在使用普通膠帶時就不會互相推擠和困惑。
「現在一次只有一個人可以放下或拿起玩具,」聖誕老人解釋道。
這就是它的樣子:
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(); // Уведомляем производителей о свободном месте } } }
wait和notifyAll的神奇屬性:
wait():使執行緒休眠,直到某個條件(例如空磁帶)變成 false。
notifyAll():喚醒所有等待線程,檢查它們是否可以繼續。
第二個魔法:BlockingQueue
聖誕老人意識到精靈們經常忘記叫notifyAll,這造成了延遲。然後他使用了一個神奇的工具——BlockingQueue,它本身就負責處理線程。
BlockingQueue 執行以下操作:
如果磁帶已滿,製造商會自動等待。
如果磁帶是空的,打包者自己就會明白他需要等待。
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(); // Уведомляем производителей о свободном месте } } }
第三個魔法:執行器和執行緒池
為了讓精靈們不累,聖誕老公公創造了一個神奇的工具-線程池。現在每個精靈各司其職,數量也自動調節。
「精靈們不會再互相追趕了,一切都很順利。」聖誕老人高興地說。
程式碼範例:
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):建立一個將被重複使用的 n 個執行緒池。
提交(任務):在其中一個執行緒中啟動一項任務。
shutdown():所有任務完成後停止執行。
第四個魔法:CompletableFuture
在最後階段,聖誕老人添加了一點額外的魔法:現在精靈們非同步工作,這加快了進程。
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(); // Завершаем работу после выполнения всех задач } }
CompletableFuture 的神奇屬性:
非同步:任務在後台執行緒中執行,不會阻塞主執行緒。
易於使用:無需手動管理線程。
新年有救了!
當最後一個玩具裝完後,聖誕老公公高興地嘆了口氣。 「精靈們,你們做了一件了不起的工作。多線程的魔力讓我們不僅更快,而且更快樂!」
現在,在除夕夜的每個晚上,聖誕老人都會向他的助手講述一個關於多線程如何拯救節日的童話故事。
✨ 朋友們,新年快樂! ?
以上是聖誕老人的節日競賽:Java 多線程的魔力的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

公司安全軟件導致部分應用無法正常運行的排查與解決方法許多公司為了保障內部網絡安全,會部署安全軟件。 ...

將姓名轉換為數字以實現排序的解決方案在許多應用場景中,用戶可能需要在群組中進行排序,尤其是在一個用...

在使用IntelliJIDEAUltimate版本啟動Spring...

系統對接中的字段映射處理在進行系統對接時,常常會遇到一個棘手的問題:如何將A系統的接口字段有效地映�...

在使用MyBatis-Plus或其他ORM框架進行數據庫操作時,經常需要根據實體類的屬性名構造查詢條件。如果每次都手動...

Java對象與數組的轉換:深入探討強制類型轉換的風險與正確方法很多Java初學者會遇到將一個對象轉換成數組的�...

Redis緩存方案如何實現產品排行榜列表的需求?在開發過程中,我們常常需要處理排行榜的需求,例如展示一個�...

電商平台SKU和SPU表設計詳解本文將探討電商平台中SKU和SPU的數據庫設計問題,特別是如何處理用戶自定義銷售屬...
