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