進程與線程 進程是程式(任務)的執行過程,具有動態性;持有資源(共用記憶體、共用文件)和線程,是資源和線程的載體。 線程是系統中最小的執行單元,同一進程中有多個線程,線程共用進程的資源。 線程的交互,交互的方式包括互斥與同步。 線程的常用方法 java對線程的支持主要體現在類Thread和介面Runn ...
- 進程與線程
進程是程式(任務)的執行過程,具有動態性;持有資源(共用記憶體、共用文件)和線程,是資源和線程的載體。
線程是系統中最小的執行單元,同一進程中有多個線程,線程共用進程的資源。
線程的交互,交互的方式包括互斥與同步。
- 線程的常用方法
java對線程的支持主要體現在類Thread和介面Runnable,它們都繼承java.lang包,有一個共同的方法run()
- 線程停止錯誤的方法:stop()、interrupt()
- 線程停止的正確方法
public class ArmyRunnable implements Runnable { //volatile保證了線程可以正確讀取其他線程寫入的值 volatile boolean keepRunning = true; @Override public void run() { while(keepRunning) { //發動五連擊 for (int i = 0; i < 5 ; i++) { System.out.println(Thread.currentThread().getName() + "進攻對方[" + i + "]"); } //暫停 Thread.yield(); } System.out.println(Thread.currentThread().getName() + "結束了戰鬥"); } }
- 爭用條件
當多個線程同時共用訪問同一數據(記憶體區域)時,每個線程都嘗試操作該數據,從而導致數據被破壞(corrupted),這種現象稱為爭用條件。
- 線程的交互:互斥與同步
互斥:在同一時間,只能有一條線程去對我們的關鍵數據或臨界區進行操作。
互斥的實現:sysnchronized(intrinsic lock),sysnchronized相當於給代碼加上一把鎖,使其他線程不能進入這個關鍵區域訪問我們的關鍵資源。
同步:是線程之間的一種通信機制, 由於一條線程的某些條件不具備,使得其他線程處於某種等待的狀態,之後由於條件具備了,一條線程會用某種方式喚醒其他的線程。
同步的實現:wait()/notify()/notifyAll()--Object對象的成員方法
wait set 是線程的休息室
public void transfer(int from, int to, double amount) { //通過synchronized 關鍵字來實現互斥,synchronized既可以出現在方法之上,也能以塊的形式出現在方法體之中 //通過對lockObj加鎖實現互斥 //加鎖操作是有開銷的,多次加鎖操作會降低系統的性能 synchronized (lockObj) {//while迴圈,保證條件不滿足時任務都會被條件阻擋,而不是繼續競爭CPU資源 while (energyBoxes[from] < amount) { try { //條件不滿足,將當前線程放入鎖對象(lockObj)上的wait set //wait set 是線程的休息室 lockObj.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(Thread.currentThread().getName()); energyBoxes[from] -= amount; System.out.printf("從%d轉移%10.2f單位能量到%d", from, amount, to); energyBoxes[to] += amount; System.out.printf("能量總和:%10.2f%n",getTotalEnergies()); //喚醒所有在lockObj對象上等待的線程 lockObj.notifyAll(); } }
- 擴展
Java Memory Mode
Locks & Condition
線程安全性: 原子性與可見性 ...
多線程編程常用的交互模型
Java5中併發編程工具
- 參考書
core java
Java concurrency in practice