一個(gè)android應(yīng)用就是一個(gè)Linux進(jìn)程,每個(gè)應(yīng)用在各自的進(jìn)程中運(yùn)行,互不干擾,比較安全。
一個(gè)應(yīng)用對應(yīng)一個(gè)主線程,就是通常所說的UI線程,android遵守的就是單線程模型,所以說Ui操作不是線程安全的
學(xué)習(xí)參考:線程的幾種狀態(tài)轉(zhuǎn)換
學(xué)習(xí)參考:Android 中三種啟用線程的方法
1、通過繼承Thread類,并改寫run方法來實(shí)現(xiàn)一個(gè)線程·
new MyThread().start();
2、啟用方式創(chuàng)建一個(gè)Runnable對象
new Thread(new MyRunnable()).start();
3、通過Handler啟動(dòng)線程
mHandler.post(mRunnable)
終止線程:
1、使用退出標(biāo)志,使線程正常退出,也就是當(dāng)run方法完成后線程終止。
2、使用stop方法強(qiáng)行終止線程(這個(gè)方法不推薦使用,因?yàn)閟top和suspend、resume一樣,也可能發(fā)生不可預(yù)料的結(jié)果)。 thread.stop()。
3、使用interrupt方法中斷線程。
使用interrupt方法來終端線程可分為兩種情況:
1、線程處于阻塞狀態(tài),如使用了sleep方法。
2、使用while(!isInterrupted()){……}來判斷線程是否被中斷。
在第一種情況下使用interrupt方法,sleep方法將拋出一個(gè)InterruptedException例外,而在第二種情況下線程將直接退出。
線程等待:
join()和sleep()方法
join()方法也可以理解為線程之間協(xié)作的一種方式,當(dāng)兩個(gè)線程需要順序執(zhí)行時(shí),調(diào)用第一個(gè)線程的join()方法能使該線程阻塞,其依然通過wait()方法來實(shí)現(xiàn)的。另外,還有帶時(shí)間參數(shù)的join()方法,在超出規(guī)定時(shí)間后,退出阻塞狀態(tài)。同樣的,其通過帶時(shí)間參數(shù)的wait()方法實(shí)現(xiàn)而已。sleep()與wait()的相同之處在于它們都是通過等待阻塞線程,不同之處在于sleep()等待的是時(shí)間,wait()等待的是對象的鎖。
Android幾種進(jìn)程
1、前臺進(jìn)程:即與用戶正在交互的Activity或者Activity用到的Service等,如果系統(tǒng)內(nèi)存不足時(shí)前臺進(jìn)程是最后被殺死的
2、可見進(jìn)程:可以是處于暫停狀態(tài)(onPause)的Activity或者綁定在其上的Service,即被用戶可見,但由于失去了焦點(diǎn)而不能與用戶交互
3、服務(wù)進(jìn)程:其中運(yùn)行著使用startService方法啟動(dòng)的Service,雖然不被用戶可見,但是卻是用戶關(guān)心的,例如用戶正在非音樂界面聽的音樂或者正在非下載頁面自己下載的文件等;當(dāng)系統(tǒng)要空間運(yùn)行前兩者進(jìn)程時(shí)才會被終止
4、后臺進(jìn)程:其中運(yùn)行著執(zhí)行onStop方法而停止的程序,但是卻不是用戶當(dāng)前關(guān)心的,例如后臺掛著的QQ,這樣的進(jìn)程系統(tǒng)一旦沒了有內(nèi)存就首先被殺死
5、空進(jìn)程:不包含任何應(yīng)用程序的程序組件的進(jìn)程,這樣的進(jìn)程系統(tǒng)是一般不會讓他存在的