發表文章

目前顯示的是有「Java Thread」標籤的文章

設計模式 - 工廠模式 (Creational Patterns - Factory Pattern)

圖片
前言 這篇文章會介紹三個最常使用的工廠模式方法,分別是 Simple Factory (簡單工廠) Abstract Factory (抽象工廠) Factory Method (工廠方法) 其中最容易讓人搞混的是,Abstract Factory和Factory Method,不過對我來說何必太過糾結於這兩個的概念,工廠模式最主要的核心原理就是將你創造物件的邏輯隱藏起來,不向客戶端顯示,我覺得只要知道這個概念就夠了,接下來會介紹這三個種類的工廠模式。 Factory Pattern 工廠模式 Simple Factory 簡單工廠 簡單工廠是工廠模式的第一步,也是工廠模式最基本的核心概念實踐,主要解決的問題是 將創建物件邏輯抽離 解偶Class的複雜度 Class Diagram 將封裝物件邏輯抽出寫成Simple Factory 產出父類別物件的物件 範例 在這個範例我們希望將戰士與魔法師遊戲創造英雄的邏輯抽出並且寫成靜態工廠,戰士與魔法師都是英雄並且’目前’只能進行攻擊,程式碼如下 Interface Hero public interface Hero { void attack(); } Magician.class public class Magician implements Hero { @Override public void attack() { System.out.println("Use magic to attack"); } } Warrior.class public class Warrior implements Hero { @Override public void attack() { System.out.println("Use sword to attack"); } } HeroFactory.class public class HeroFactory { public Hero makeHero(HeroType heroType) { if (heroType.equals(HeroType.MA...

Java Thread和Runnable的執行差異

文章目的 了解Java多執行緒操作中,Thread和Runnable的差異 實作多個Thread 實作多個Runnable 如何實作可以參考 Java Thread的基礎實踐方法 實作多個Thread 原始碼 class MyThread extends Thread{ private int ticket = 5; public void run(){ for (int i=0;i<10;i++) { if(ticket > 0){ System.out.println("ticket = " + ticket--); } } } public static void main(String[] args){ new MyThread().start(); new MyThread().start(); new MyThread().start(); } } Result ticket = 5 ticket = 4 ticket = 3 ticket = 5 ticket = 4 ticket = 5 ticket = 3 ticket = 2 ticket = 1 ticket = 2 ticket = 4 ticket = 3 ticket = 2 ticket = 1 ticket = 1 解析 透過原始碼與結果可以看到 多執行緒的呼叫是隨機的,所以在Result階段並沒有如實的呈現規律的5~1排列 每個執行續使用的資源(ticket)都是獨一歸屬個別執行緒的。 所以假設今天的業務邏輯是,活動商要賣出五張票,如果使用了如上方一樣的三個執行緒,那結果可能會賣出15張超賣了10張 實作多個Runnable 原始碼 public class MyRunnable implements Runnable { private int ticket = 5; public void run(){ for (int i=0;i<10;i++) ...

Java Thread的基礎實踐方法

文章目的 讓讀者了解Java Thread的方法,目前Java Thread有三種實踐方法如下 實作Runnable介面 實作Callable介面 繼承Thread類別 實作Runnable Runnable是甚麼? Runnable是一個介面提供一個run方法,原始程式碼如下 原始碼 @FunctionalInterface public interface Runnable { /** * When an object implementing interface <code>Runnable</code> is used * to create a thread, starting the thread causes the object's * <code>run</code> method to be called in that separately executing * thread. * <p> * The general contract of the method <code>run</code> is that it may * take any action whatsoever. * * @see java.lang.Thread#run() */ public abstract void run(); } 原始碼要點 @FunctinalInerface annotation是標明此介面可以透過Java8 lambda的方式去實踐 run方法沒有回傳值,代表執行後無法接收解果 實踐方法 實作runnable中的run方法,在傳入thread的建構者創建新的thread,並且執行run public class MyRunnable implements Runnable { @Override public void run() { System.out.println("Hi my name is Monster Lee"); ...