進程和線程:
1)進程是靜態的,其實就是指開啟的一個程序;而線程是動態的,是真正執行的單元,執行的過程。其實我們平時看到的進程,是線程在執行着,因為線程是作為進程的一個單元存在的。
2)同樣作為基本的執行單元,線程是划分得比進程更小的執行單位。
3)每個進程都有一段專用的內存區域。與此相反,線程卻共享內存單元(包括代碼和數據),通過共享的內存單元來實現數據交換、實時通信與必要的同步操作。
1、創建線程的方式:
創建方式一:繼承Thread
1:定義一個類繼承Thread
2:覆蓋Thread中的run方法(將線程運行的代碼放入run方法中)。
3:直接創建Thread的子類對象
4:調用start方法(內部調用了線程的任務(run方法));作用:啟動線程,調用run方法
方式二:實現Runnable
1:定義類實現Runnable接口
2:覆蓋Runnable接口中的run方法,將線程的任務代碼封裝到run中
3:通過Thread類創建線程對象
4、並將Runnable接口的子類對象作為Thread類的構造函數參數進行傳遞
作為參數傳遞的原因是讓線程對象明確要運行的run方法所屬的對象。
區別:
繼承方式:線程代碼放在Thread子類的run方法中
實現方式:線程存放在接口的子類run方法中;避免了單繼承的局限性,建議使用。
2、線程狀態:
新建:start()
臨時狀態:具備cpu的執行資格,但是無執行權
運行狀態:具備CPU的執行權,可執行
凍結狀態:通過sleep或者wait使線程不具備執行資格,需要notify喚醒,並處於臨時狀態。
消亡狀態:run方法結束或者中斷了線程,使得線程死亡。
3、多線程安全問題:
多個線程共享同一數據,當某一線程執行多條語句時,其他線程也執行進來,導致數據在某一語句上被多次修改,執行到下一語句時,導致錯誤數據的產生。
因素:多個線程操作共享數據;多條語句操作同一數據
解決:
原理:某一時間只讓某一線程執行完操作共享數據的所有語句。
辦法:使用鎖機制:synchronized或lock對象
4、線程的同步:
當兩個或兩個以上的線程需要共享資源,他們需要某種方法來確定資源在某一刻僅被一個線程占用,達到此目的的過程叫做同步(synchronization)。
同步代碼塊:synchronized(對象){},將需要同步的代碼放在大括號中,括號中的對象即為鎖。
同步函數:放於函數上,修飾符之后,返回類型之前。
5、wait和sleep的區別:(執行權和鎖區分)
wait:可指定等待的時間,不指定須由notify或notifyAll喚醒。
線程會釋放執行權,且釋放鎖。
sleep:必須制定睡眠的時間,時間到了自動處於臨時(阻塞)狀態。
即使睡眠了,仍持有鎖,不會釋放執行權。
Android下 的進程與線程:
1、進程的生命周期:
1)、進程的創建及回收:
進程是被系統創建的,當內存不足的時候,又會被系統回收
2)、進程的級別:
Foreground Process 前台進程
Visible Process 可視進程
Service Process 服務進程:可以提高級別的
Background Process 后台進程
Empty Process 空進程(無組件啟動,做進程緩存使用,恢復速度快)
總結用的安全與不安全API
Hashtable-->HashMap
StringBuffer-->StringBuilder
線程安全就是為了在單們時間內某個線程操作的是同樣的數據