Main Thread 執行 main() 方法
threadobj.start() 執行Thread子類別 run()
參考 page 13-4 表 13-1 Thread 類別常用的成員
參考 page 13-6 程式範例 ThreadEx.java
參考 page 13-9 圖 13-5 實作Runnable 介面
參考 page 13-9 程式範例 RunnableEx.java
需要有Lock機制,在方法前面 加上 synchronized 修飾詞
參考 page 13-14 程式範例 SyncEx.java
synchronized public void sell(int qty) { String name = Thread.currentThread().getName(); int sum = sale; // sum是分店暫存的總銷售量 sum += qty; System.out.println(name + " 銷售量:" + qty + ";公司總銷售量:" + sum); sale = sum; }
class CompanyC { private int sale = 0; // 總銷售量 public void sell(int qty) { // getName 方法不會更改 Company物件,可以不鎖定 String name = Thread.currentThread().getName(); // 可以彈性鎖定想要鎖定的物件與區塊,而不必鎖定整個方法 synchronized (this) { int sum = sale; // sum是分店暫存的總銷售量 sum += qty; System.out.println(name + " 銷售量:" + qty + ";公司總銷售量:" + sum); sale = sum; } } }
class CompanyD { private static int sale = 0; // static synchronized public static void sell(int qty) { String name = Thread.currentThread().getName(); sale += qty; System.out.println(name + " 銷售量:" + qty + ";公司總銷售量:" + sale); } }
class CompanyE { private static int sale = 0; // static public static void sell(int qty) { String name = Thread.currentThread().getName(); synchronized (CompanyE.class) { sale += qty; } System.out.println(name + " 銷售量:" + qty + ";公司總銷售量:" + sale); } }
參考 page 13-19 注意 wait(), notify() 方法在 Object中,任何物件都可以呼叫,但必須在 synchronized 方法或區塊中
參考 page 13-19 程式範例 WaitNotifyEx.java