ch13 多執行緒程式設計

13-1 多執行緒簡介

13-2 Java 執行緒 Thread 類別

Main Thread 執行 main() 方法

threadobj.start() 執行Thread子類別 run()

參考 page 13-4 表 13-1 Thread 類別常用的成員

參考 page 13-6 程式範例 ThreadEx.java

13-3 Runnable 介面

參考 page 13-9 圖 13-5 實作Runnable 介面

參考 page 13-9 程式範例 RunnableEx.java

13-4 執行緒的同步性(Synchronization)與安全性(Thread Safe)

13-4-1 synchronized 方法

需要有Lock機制,在方法前面 加上 synchronized 修飾詞

參考 page 13-14 程式範例 SyncEx.java

13-4-2 synchronized 區塊

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;
		}
	}
}

13-4-3 鎖定類別資料的存取

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);
	}
}

13-5 執行緒的互動處理

參考 page 13-19 注意 wait(), notify() 方法在 Object中,任何物件都可以呼叫,但必須在 synchronized 方法或區塊中

參考 page 13-19 程式範例 WaitNotifyEx.java