進程與執行緒
進程是程式(任務)的執行過程,具有動態性;持有資源(共享記憶體、共享檔案)和執行緒,是資源和執行緒的載體。
線程是系統中最小的執行單元,同一進程中有多個線程,線程共享進程的資源。
執行緒的交互,交互的方式包括互斥與同步。
執行緒的常用方法
java對執行緒的支援主要體現在類別Thread和介面Runnable,它們都繼承java.lang包,有一個共同的方法run()
public class ArmyRunnable implements Runnable {//volatile保证了线程可以正确读取其他线程写入的值volatile boolean keepRunning = true; @Overridepublic 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() + "结束了战斗"); } }
同步:是執行緒之間的一種通訊機制, 由於一條執行緒的某些條件不具備,使得其他執行緒處於某種等待的狀態,之後由於條件具備了,一條執行緒會用某種方式喚醒其他的執行緒。
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(); } }
Runnable方式和Thread方式建立執行緒的差異
的狀況
使用者執行緒:運行在前台,執行具體的任務,如程序的主線程、連接網絡的子線程
#守護線程:運行在後台,為其他前台線程服務,一旦所有用戶線程都結束運行,守護線程會隨JVM一起結束工作。
守護執行緒的應用:資料庫連線池中的監控執行緒、JVM虛擬機啟動後的監控執行緒。最常見的守護線程是垃圾回收線程
設定守護線程:透過呼叫Thread類別的setDaemon(true)方法來設定目前的執行緒為守護線程。注意:setDaemon(true)必須在start()方法之前調用,否則會拋出異常;在守護線程中產生的新線程也是守護線程;不是所有的任務都可以分配給守護線程來執行,例如讀寫操作或者計算邏輯。
擴充
######### Java Memory Mode####### Locks & Condition###### 執行緒安全性:原子性與可見性...###### 多執行緒程式設計常用的互動模型###### Java5中並發程式設計工具#############參考書# ########### core java###### Java concurrency in practice###以上是Java—進程與執行緒的實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!