每次學(xué)到的東西和運(yùn)用的知識(shí)總是片面性的坟乾,沒(méi)有一個(gè)很好的沉淀档桃,近段時(shí)間有了空閑時(shí)間枪孩,所以對(duì)自身學(xué)到的點(diǎn),進(jìn)行一個(gè)簡(jiǎn)單的記錄:
一藻肄、線程
1蔑舞、定義
線程:程序中單獨(dú)順序的控制流,線程本身依靠程序進(jìn)行運(yùn)行嘹屯,只能使用分配給程序的資源和環(huán)境攻询。
2、作用
減少程序在并發(fā)執(zhí)行時(shí)所付出的時(shí)空開(kāi)銷(xiāo)州弟,提高操作系統(tǒng)的并發(fā)性能钧栖。
3、實(shí)現(xiàn)
繼承Thread類(lèi)
public class MyThread extends Thread {
@Override
public void run() {
super.run();
}
}
實(shí)現(xiàn)Runnable接口
public class MyRunnable implements Runnable {
@Override
public void run() {
}
}
4婆翔、狀態(tài)
——?jiǎng)?chuàng)建狀態(tài):new 一個(gè)新線程對(duì)象
——就緒狀態(tài):調(diào)用start()方法拯杠,等待cpu進(jìn)行調(diào)度
——運(yùn)行狀態(tài):執(zhí)行run()方法
——阻塞狀態(tài):sleep()/wait()暫時(shí)停止執(zhí)行狀態(tài),可能把資源交給其他線程使用
——終止?fàn)顟B(tài):線程銷(xiāo)毀
5啃奴、線程屬性
5.1潭陪、線程優(yōu)先級(jí)
在Java程序設(shè)計(jì)語(yǔ)言中,每個(gè)線程都有一個(gè)優(yōu)先級(jí)。默認(rèn)情況下依溯,一個(gè)線程繼承他的父線程的優(yōu)先級(jí)老厌。使用setPriority(int newPriority)方法提高或者降低任何一個(gè)線程的優(yōu)先級(jí)。
表示
// 譬如:
Thread.MIN_PRIORITY // 優(yōu)先級(jí)1
Thread.NORM_PRIORITY // 默認(rèn)優(yōu)先級(jí)5
Thread.MAX_PRIORITY // 優(yōu)先級(jí)10
注意:提高搶到cpu資源的可能性黎炉,但并不是一定能搶到cpu資源枝秤。
5.2、守護(hù)線程
定義:守護(hù)用戶線程的線程慷嗜,即在程序運(yùn)行時(shí)為其他線程提供一種通用服務(wù)
常見(jiàn):如垃圾回收線程
設(shè)置
//標(biāo)識(shí)該線程為守護(hù)線程或用戶線程淀弹。這一方法必須在線程啟動(dòng)之前調(diào)用。
setDaemon(boolean isDaemon)
5.3洪添、非守護(hù)線程(用戶線程)
主要包括:主線程&子線程
a. 主線程(UI線程)
定義:Android系統(tǒng)在程序啟動(dòng)時(shí)會(huì)自動(dòng)啟動(dòng)一條主線程
作用:處理四大組件與用戶進(jìn)行交互的事情(如UI垦页、界面交互相關(guān))
注:因?yàn)橛脩綦S時(shí)會(huì)與界面發(fā)生交互,因此主線程任何時(shí)候都必須保持很高的響應(yīng)速度干奢,所以主線程不允許進(jìn)行耗時(shí)操作痊焊,否則會(huì)出現(xiàn)ANR
b. 子線程(工作線程)
定義:手動(dòng)創(chuàng)建的線程
作用:耗時(shí)的操作(網(wǎng)絡(luò)請(qǐng)求、I/O操作等)
5.4 守護(hù)線程 與 非守護(hù)線程的區(qū)別
區(qū)別:虛擬機(jī)是否已退出:
當(dāng)所有用戶線程結(jié)束時(shí)忿峻,因?yàn)闆](méi)有守護(hù)的必要薄啥,所以守護(hù)線程也會(huì)終止,虛擬機(jī)也同樣退出
反過(guò)來(lái)逛尚,只要任何用戶線程還在運(yùn)行垄惧,守護(hù)線程就不會(huì)終止,虛擬機(jī)就不會(huì)退出
6绰寞、線程中的方法
sleep()和wait()
區(qū)別:
Java中的多線程是一種搶占式的機(jī)制 而不是分時(shí)機(jī)制到逊。搶占式機(jī)制指的是有多個(gè)線程處于可運(yùn)行狀態(tài),但是只有一個(gè)線程在運(yùn)行滤钱。
共同點(diǎn):
(1)觉壶、它們都是在多線程的環(huán)境下,都可以在程序的調(diào)用處阻塞指定的毫秒數(shù)件缸,并返回铜靶。
(2)、wait()和sleep()都可以通過(guò)interrupt()方法 打斷線程的暫停狀態(tài) 他炊,從而使線程立刻拋出InterruptedException争剿。
如果線程A希望立即結(jié)束線程B,則可以對(duì)線程B對(duì)應(yīng)的Thread實(shí)例調(diào)用interrupt方法痊末。如果此刻線程B正在wait/sleep /join蚕苇,則線程B會(huì)立刻拋出InterruptedException,在catch() {} 中直接return即可安全地結(jié)束線程凿叠。
需要注意的是涩笤,InterruptedException是線程自己從內(nèi)部拋出的,并不是interrupt()方法拋出的。對(duì)某一線程調(diào)用 interrupt()時(shí)辆它,如果該線程正在執(zhí)行普通的代碼,那么該線程根本就不會(huì)拋出InterruptedException履恩。但是锰茉,一旦該線程進(jìn)入到 wait()/sleep()/join()后,就會(huì)立刻拋出InterruptedException 切心。
不同點(diǎn):
(1)飒筑、Thread類(lèi)的方法:sleep(),yield()等
Object的方法:wait()和notify()等
(2)、每個(gè)對(duì)象都有一個(gè)鎖來(lái)控制同步訪問(wèn)绽昏。Synchronized關(guān)鍵字可以和對(duì)象的鎖交互协屡,來(lái)實(shí)現(xiàn)線程的同步。
sleep方法沒(méi)有釋放鎖全谤,而wait方法釋放了鎖肤晓,使得其他線程可以使用同步控制塊或者方法。
(3)认然、wait补憾,notify和notifyAll只能在同步控制方法或者同步控制塊里面使用,而sleep可以在任何地方使用
(4)卷员、sleep必須捕獲異常盈匾,而wait,notify和notifyAll不需要捕獲異常
二毕骡、多線程
1削饵、定義
多個(gè)線程同時(shí)進(jìn)行任務(wù)的執(zhí)行,目的為了更好的使用CPU資源未巫。
其實(shí)窿撬,計(jì)算機(jī)任何特定時(shí)刻只能執(zhí)行一個(gè)任務(wù);
多線程只是一種錯(cuò)覺(jué):只是因?yàn)镴VM快速調(diào)度資源來(lái)輪換線程橱赠,使得線程不斷輪流執(zhí)行尤仍,所以看起來(lái)好像在同時(shí)執(zhí)行多個(gè)任務(wù)而已
2、作用
用來(lái)解決以下兩種情況:
1狭姨、不阻塞UI線程:不在主線程中進(jìn)行耗時(shí)操作宰啦。
2、不在非UI線程中更新UI組件饼拍。
3赡模、使用場(chǎng)景
1、將耗時(shí)操作放在工作線程中進(jìn)行师抄。
2漓柑、將UI更新操作放在UI線程中進(jìn)行。
4、實(shí)現(xiàn)方式
1辆布、基礎(chǔ)使用:
繼承Thread
實(shí)現(xiàn)Runnable接口
Handler
2瞬矩、復(fù)合使用
1、AsyncTask
2锋玲、HandlerThread
3景用、IntentService
3、高級(jí)使用
1惭蹂、線程池 ThreadPool
5伞插、同步與死鎖
在大多數(shù)實(shí)際的多線程應(yīng)用中,兩個(gè)或者兩個(gè)以上的線程需要共享對(duì)同一數(shù)據(jù)的存取盾碗,這種操作屬于線程同步媚污。
同步方法:用synchronized關(guān)鍵字進(jìn)行修飾。
public synchronized void wAndroid(){
}
死鎖:死鎖就是兩個(gè)或者兩個(gè)以上的線程阻塞著廷雅,并且在等待其他死鎖線程持有的鎖耗美。
三、進(jìn)程
每一個(gè)應(yīng)用程序啟動(dòng)時(shí)對(duì)應(yīng)一個(gè)進(jìn)程榜轿,一個(gè)進(jìn)程包含一個(gè)或多個(gè)線程幽歼,一個(gè)進(jìn)程至少包含一個(gè)線程。
四谬盐、總結(jié)
此篇文章中甸私,對(duì)線程的基礎(chǔ)知識(shí)進(jìn)行了一個(gè)自我認(rèn)知的一個(gè)統(tǒng)計(jì),也是對(duì)自身的一個(gè)理解的記錄飞傀,后期會(huì)一直進(jìn)行完善皇型。如果哪里理解的不對(duì),歡迎指出砸烦。