一、程序
1、什麼是程序
通過任務管理器看到了程序的存在,只有執行的程式才會出現程序
程序:2、多程序有什麼意義?
(1)單程序的計算機只能做一件事,而我們現在的計算機都可以做多件事情。
二、執行緒
1、什麼是執行緒
在同乙個程序內又可以執行多個任務,而這每乙個任務就可以看成是乙個執行緒
2、多執行緒有什麼意義
(1)提高程式的使用率。
3、執行緒的生命週期
(1)新建:建立執行緒
(2)就緒:有執行資格,沒有執行權
(3)執行:有執行資格,有執行權
(4)死亡:執行緒物件變成垃圾,等待被**
4、實現多執行緒的兩種方式
(1)繼承thread類
packagecn.itcast_01;
public
class mythread extends
thread }}
package問題:run()裡面封裝的是被執行緒執行的**cn.itcast_01;
public
class
threaddemo
}
start()
run直接呼叫僅僅是普通方法
start()先啟動執行緒,再由jvm呼叫run()方法
(2)實現runnable介面
packagecn.itcast_02;
public
class myrunnable implements
runnable }}
package5、有了方式1,為什麼還要方式2cn.itcast_02;
public
class
myrunnabledemo
}
實現介面的好處
6、執行緒安全問題
(1)出現的原因
(2)如何解決執行緒安全問題
synchronized注意:同步可以解決安全問題的根本原因就在那個物件上,該物件如同鎖的功能(物件)
多個執行緒同一把鎖,鎖物件是任意物件
把同步加在方法上
鎖物件:this
把同步載入方法上
這裡的鎖物件是當前類的位元組碼檔案物件
7、死鎖問題
兩個或者兩個以上的執行緒在爭奪資源的過程中,發生的一種相互等待的現象
packagecn.itcast_02;
public
class dielock extends
thread
public
void
run() }}
else}}
}}
package(1)死鎖產生的原因cn.itcast_02;
public
class
dielockdemo
}
通常系統中擁有的不可剝奪資源,其數量不足以滿足多個程序執行的需要,使得程序在執行過程中,會因爭奪資源而陷入僵局,如磁帶機,印表機等。
只有對不可剝奪資源的競爭才可能產生死鎖,對可剝奪資源的競爭是不會產生死鎖的
程序在執行過程中,請求和釋放資源的順序不當,也同樣會導致死鎖
訊號量使用不當也會造成死鎖。程序間相互等待對方發來的訊息,結果也會使得這些程序間無法向前推進。
例如,程序a等待程序b發的訊息,程序b又在等待程序a發的訊息,可以看出程序a和程序b不是因為競爭同一資源,而是在等待對方的資源導致死鎖
(2)產生死鎖的四個必要條件:
(3)如何避免死鎖
當多個需要相同的一些鎖,但是按照不同的順序加鎖,死鎖就很容易產生
如果能確保所有的執行緒都是按照相同的順序獲得鎖,那麼死鎖就不會發生
若乙個執行緒沒有在給定的時限內成功獲得所有需要的鎖,則會進行回退並釋放所有已經獲得的鎖,然後等待一段隨機的時間再重試,這段隨機的等待時間讓其它執行緒有機會嘗試獲取相同的這些鎖,並且讓該應用在沒有獲得鎖的時候可以繼續執行(加鎖超時後可以先繼續執行幹點其它事情,再回頭來重複之前加鎖的邏輯)
主要針對那些不可能實現按序加鎖並且鎖超時也不可行的場景
當乙個執行緒請求鎖失敗時,這個執行緒可以遍歷鎖的關係圖看看是否有死鎖發生
做法:釋放所有鎖,回退,並且等待一段隨機的時間後重試。這個和簡單的加鎖超時類似,不一樣的是只有死鎖已經發生了才回退,而不會是因為加鎖的請求超時了。雖然有回退和等待,但是如果有大量的執行緒競爭同一批鎖,它們還是會重複地死鎖 (編者注:原因同超時類似,不能從根本上減輕競爭)。
乙個更好的方案是給這些執行緒設定優先順序,讓乙個(或幾個)執行緒回退,剩下的執行緒就像沒發生死鎖一樣繼續保持著它們需要的鎖。如果賦予這些執行緒的優先順序是固定不變的,同一批執行緒總是會擁有更高的優先順序。為避免這個問題,可以在死鎖發生的時候設定隨機的優先順序。
8、多執行緒狀態轉換圖
常見的情況:
9、執行緒池
程式啟動乙個新執行緒成本是比較高的
使用執行緒池可以很好的提高效能
執行緒池裡的每乙個執行緒**結束後,並不會死亡,而是再次回到執行緒池中成為空閒狀態,等待下乙個物件來使用
方法一:
publicclass myrunnable implements
runnable
}
/*方法二:* 執行緒池的好處:
* 如何實現執行緒的**?
* a:建立乙個執行緒池物件,控制要建立幾個執行緒物件
* public static executorservice newfixedthreadpool(int nthreads)
* b:這種執行緒池的執行緒可以執行
* 可執行runnable物件或者callable物件代表的執行緒
* 做乙個類實現runnable介面
* c:呼叫如下方法
* future> submit(runnable task)
* futuresubmit(callabletask)
* */
import
j**a.util.concurrent.executorservice;
import
j**a.util.concurrent.executors;
public
class
executorsdemo
}
importj**a.util.concurrent.callable;
public
class mycallable implements callable
public integer call() throws
exception
}
importj**a.util.concurrent.executionexception;
import
j**a.util.concurrent.executorservice;
import
j**a.util.concurrent.executors;
import
j**a.util.concurrent.future;
public
class
callabledemo
}
多執行緒與多程序
程序 程序是程式的一次執行,在傳統的計算機中,程序既是基本的分配單元,也是基本的執行單元。執行緒 執行緒是可執行的實體單元,它是處理機排程的基本單位。由於執行緒在同一位址空間,因此建立和撤銷執行緒的開銷小,執行緒間的通訊效率高,切換迅速。在多處理機系統中,對程序的個數有所限制,但對執行緒的個數不存在...
多執行緒與多程序
魚還是熊掌 多程序多執行緒的選擇 關於多程序和多執行緒,教科書上最經典的一句話是 程序是資源分配的最小單位,執行緒是cpu排程的最小單位 這句話應付考試基本上夠了,但如果在工作中遇到類似的選擇問題,那就沒有這麼簡單了,選的不好,會讓你深受其害。經常在網路上看到有的xdjm問 多程序好還是多執行緒好?...
多程序與多執行緒
import threading建立乙個執行緒,指向的函式,不接收引數的情況 t threading.thread target 函式名 建立乙個執行緒,指向的函式,收引數的情況 t threading.thread target 函式名,args 實參1,執行緒物件名.start 生命週期 我們的...