




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
Java課程Phase3目錄Java課程 1Phase3 12016-06-02 2Android中的多線程應(yīng)用 2往期回顧 2線程基礎(chǔ) 2線程對(duì)象的創(chuàng)建 3線程對(duì)象的狀態(tài)及常用方法 3線程同步 4關(guān)于內(nèi)部類的問題 42016-06-03 7線程通訊->線程同步協(xié)作 7線程通訊應(yīng)用-前提/實(shí)現(xiàn) 7單例模式 7回顧->靜態(tài)修飾符詳解static 82016-06-06 9FAQ? 9Android線程通訊的消息模型 9消息對(duì)象的偽代碼實(shí)現(xiàn) 9Android中線程通訊的實(shí)現(xiàn)–借助消息模型 10線程消息模型FAQ 10Android中的HandlerThread{}類 102016-06-07 10往期回顧:android中的線程應(yīng)用機(jī)制?線程通訊機(jī)制?消息模型架構(gòu)? 10線程方法應(yīng)用介紹 11異步任務(wù)AsyncTask 112016-06-02Android中的多線程應(yīng)用往期回顧Android數(shù)據(jù)存儲(chǔ)內(nèi)存外存(內(nèi)置sdcard,外置sdcard,網(wǎng)絡(luò))AndroidUI操作UI是系統(tǒng)(App)對(duì)外的窗口UI負(fù)責(zé)與用戶進(jìn)行交互所有的UI操作以及事件處理操作都應(yīng)該放在主線程執(zhí)行;所有的耗時(shí)操作都應(yīng)該在子線程操作;Android中的線程應(yīng)常用的線程操作模式:工作線程進(jìn)行耗時(shí)操作,操作數(shù)據(jù),并將操作完成的數(shù)據(jù)結(jié)果傳遞給主線程,由主線程更新UI。FAQ?何為線程?何為工作線程?何為主線程?工作線程如何將數(shù)據(jù)傳遞給主線程?->線程通訊??!線程基礎(chǔ)何為操作系統(tǒng)?操作系統(tǒng)是軟件;作用為負(fù)責(zé)管理和調(diào)度硬件,并為應(yīng)用軟件的執(zhí)行提供平臺(tái)支持;操作系統(tǒng)分為單任務(wù)、多任務(wù)操作系統(tǒng):單任務(wù)操作系統(tǒng):DOS;->同一時(shí)刻只能執(zhí)行一個(gè)任務(wù)多任務(wù)操作系統(tǒng):Windows,Linux,Unix,IOS;->同一時(shí)刻可執(zhí)行多個(gè)任務(wù);Android底層系統(tǒng)是Linux.所謂多任務(wù)即同一時(shí)刻可執(zhí)行多個(gè)任務(wù),即能夠并發(fā)執(zhí)行多個(gè)任務(wù),但多個(gè)任務(wù)是否能夠同時(shí)執(zhí)行仍取決于CPU的個(gè)數(shù)即核數(shù)。對(duì)于單CPU而言,僅有一個(gè)處理器輪詢多個(gè)任務(wù),但輪詢時(shí)間極短,宏觀上看上去感覺像是多個(gè)任務(wù)(即應(yīng)用程序)同時(shí)進(jìn)行,但實(shí)際上每個(gè)時(shí)間片段僅執(zhí)行一個(gè)任務(wù)。何為進(jìn)程?正在運(yùn)行的程序都是進(jìn)程;Windows平臺(tái)下進(jìn)程表現(xiàn)為”.exe”程序;(沒有運(yùn)行的程序不是進(jìn)程);操作系統(tǒng)中所有的任務(wù)都是運(yùn)行在其對(duì)應(yīng)的進(jìn)程中的;進(jìn)程由操作系統(tǒng)進(jìn)行創(chuàng)建、啟動(dòng)并管理;操作系統(tǒng)在啟動(dòng)進(jìn)程時(shí)率先啟動(dòng)一個(gè)主線程(即主任務(wù));主線程負(fù)責(zé)執(zhí)行任務(wù),主線程中可以調(diào)用其他的任務(wù)(即子線程)。此處,進(jìn)程即為應(yīng)用程序,線程為應(yīng)用程序中的任務(wù),可有多個(gè),但僅有一個(gè)主線程,其他的均為子線程。何為線程?線程是進(jìn)程中的一個(gè)順序執(zhí)行流(即一個(gè)線程內(nèi)的所有操作都是順序執(zhí)行的),一個(gè)進(jìn)程可以有多個(gè)線程,其中肯定有一個(gè)是主線程,主線程之外的其他線程通稱為工作線程(子線程);Java中所有的線程類型為Thread類型。線程對(duì)象的創(chuàng)建Java中的線程對(duì)象的創(chuàng)建需要借助Thread{}類,構(gòu)造方法如下:Thread()->需要重寫Thread{}類的run()方法,在此方法中執(zhí)行業(yè)務(wù)代碼。Thread(Runnabletask)->重寫實(shí)現(xiàn)了Runnable{}接口中的run()方法;在此方法中執(zhí)行業(yè)務(wù)邏輯;線程的啟動(dòng)通過調(diào)用線程對(duì)象的start()方法來實(shí)現(xiàn)。多線程并發(fā)執(zhí)行,可以提高系統(tǒng)的處理效率,同時(shí)也會(huì)增加系統(tǒng)的維護(hù)和調(diào)試難度。線程對(duì)象的狀態(tài)及常用方法新建狀態(tài)(newThread())就緒狀態(tài)(線程處于可運(yùn)行狀態(tài),可以獲得CPU的資源(但能否獲得CPU資源仍需由CPU屬性及當(dāng)前狀態(tài)決定))運(yùn)行狀態(tài)(正在執(zhí)行線程的run()方法)阻塞狀態(tài)(例如調(diào)用了sleep(longtimeMillisecond)方法,或者執(zhí)行IO操作);如:scanner.nextLine();死亡狀態(tài)(線程運(yùn)行結(jié)束后被銷毀的狀態(tài),destroy()方法)常用方法start;run;sleep;interrupt;setDaemon;join;yield;getName;setName;currentThread;isAlive;setDaemon(trueorfalse)設(shè)置當(dāng)前線程是否為守護(hù)線程(當(dāng)進(jìn)程中無任何線程執(zhí)行時(shí),該線程終止);join(longtimeMillis)設(shè)定某一線程優(yōu)先執(zhí)行;設(shè)定時(shí)間參數(shù)表示讓該線程優(yōu)先執(zhí)行一段時(shí)間后,繼續(xù)之后后面的代碼;若不設(shè)定時(shí)間,則指僅當(dāng)該線程執(zhí)行完成后,方可執(zhí)行后面的代碼;yield()讓出cpu,但線程仍處于就緒狀態(tài);線程同步定義:多個(gè)線程并發(fā)執(zhí)行時(shí),在共享數(shù)據(jù)集上的互斥與協(xié)作。線程同步時(shí)保證線程安全的手段。例如多個(gè)線程同時(shí)售賣共同的100張票;使用synchronized關(guān)鍵字,保證在某一時(shí)刻只能有一個(gè)線程在此代碼塊上執(zhí)行。多個(gè)線程在當(dāng)前代碼塊按順序執(zhí)行。方法一:使用同步代碼塊,即在run()方法中,將共同使用的數(shù)據(jù)使用synchronized(對(duì)象鎖){執(zhí)行代碼,內(nèi)含共同使用的數(shù)據(jù)}修飾;此處“對(duì)象鎖”可以使用this,非靜態(tài)類中表示該類的對(duì)象,如果該類為靜態(tài)類,則表示該靜態(tài)類所在的類的對(duì)象(***.class);方法二:使用同步方法,即publicsynchronizedvoidmethod(){執(zhí)行代碼塊,內(nèi)含共同使用的數(shù)據(jù)};回顧:StringBuffer是線程安全的StringBuilder,前者使用線程同步方法,但效率較低,所以區(qū)分使用。詳見源碼的append()方法。Vector是線程安全的ArrayList.HashTable是線程安全的HashMap.Put()方法Collection中有synchronizedSet等接口List,Set,QueueMapHashMap,TreeMap,LinkedHashMap關(guān)于內(nèi)部類的問題Java程序中創(chuàng)建成員內(nèi)部類對(duì)象時(shí),當(dāng)該成員內(nèi)部類為非static變量,需要先創(chuàng)建外部類的對(duì)象,然后通過外部類的對(duì)象.new關(guān)鍵字來創(chuàng)建內(nèi)部類的對(duì)象;而在Android應(yīng)用程序中,可在onCreate()方法分中直接new出非靜態(tài)的成員內(nèi)部類的對(duì)象:如InnerThreadinner=newInnerThread();為什么呢?因?yàn)镴ava中main方法是static方法,靜態(tài)方法只能調(diào)用靜態(tài)變量,否則就必須創(chuàng)建外部類的對(duì)象以后(此時(shí)已經(jīng)作為外部類對(duì)象的屬性加載了內(nèi)部類),方可創(chuàng)建內(nèi)部類的對(duì)象。在android的activity的onCreate()方法中,該方法為非static方法,所以可直接new出內(nèi)部類的對(duì)象,因?yàn)閛nCreate()方法實(shí)際上就是創(chuàng)建了一個(gè)該activity類的對(duì)象,此時(shí)已經(jīng)將內(nèi)部類加載到內(nèi)存中,所以可以直接new內(nèi)部類的對(duì)象。代碼如下:publicclassThreadPractice{ protectedstaticStrings; publicstaticvoidmain(String[]args){ finalScannersc=newScanner(System.in); newThread(){ @Override publicvoidrun(){ System.out.print("請輸入:"); s=sc.nextLine(); sc.close(); } }.start(); /* *線程對(duì)象start()方法執(zhí)行后,默認(rèn)執(zhí)行線程對(duì)象的run()方法; *該run()方法中明示:當(dāng)線程對(duì)象參數(shù)中的Runnable接口的實(shí)現(xiàn)類對(duì)象target不為空時(shí), *執(zhí)行target對(duì)象的run()方法,所以可通過傳入target參數(shù)實(shí)現(xiàn)對(duì)應(yīng)的功能。 *該target對(duì)象的run()方法可以執(zhí)行的先決條件是Thread類對(duì)象的run()方法中有調(diào)用, *即,如果重寫了Thread類的run()方法,但重寫的方法中未調(diào)用target的run()方法, *則永遠(yuǎn)不會(huì)執(zhí)行target對(duì)象的run()方法。 */ while(s==null) ; newThread(newRunnable(){ @Override publicvoidrun(){ System.out.println("s="+s); } }).start(); Runnablerunner=newRunnable(){ @Override publicvoidrun(){ //此處代碼輸出 System.out.println("Runnable{}->runner.run()"); } }; /* *成員內(nèi)部類的對(duì)象的創(chuàng)建在main()方法中:該方法為靜態(tài)方法 *當(dāng)成員內(nèi)部類為非static時(shí),只有當(dāng)創(chuàng)建了外部類的對(duì)象后,才可以通過外部類的對(duì)象, *使用.new關(guān)鍵字,創(chuàng)建內(nèi)部類的對(duì)象;因?yàn)橹挥袆?chuàng)建了外部類的對(duì)象后,內(nèi)部類才會(huì)像外部類的其他成員(privateint *x)一樣被加載到內(nèi)存,此時(shí)才會(huì)有內(nèi)部類出現(xiàn)。 * *當(dāng)成員內(nèi)部類為static時(shí),即該類加載時(shí)先將static關(guān)鍵字標(biāo)識(shí)的成員全部加載到內(nèi)存中,所以此時(shí)可以直接創(chuàng)建靜態(tài)內(nèi)部類的對(duì)象。 */ ThreadPracticepractice=newThreadPractice(); InnerThread1inner=practice.newInnerThread1(runner); //InnerThreadinner=newInnerThread(runner); /* *創(chuàng)建內(nèi)部類的對(duì)象并使用傳入?yún)?shù)runner的構(gòu)造方法; *如果重寫了InnerThread中的run()方法,且其中不調(diào)用runner的run()方法; *則runner的run()方法永遠(yuǎn)不會(huì)執(zhí)行; *當(dāng)不重寫InnerThread類中的run()方法時(shí),其對(duì)象默認(rèn)調(diào)用父類Thread{}的run()方法; *在該父類的方法中有調(diào)用runner的run()方法的代碼,所以不重寫時(shí),會(huì)調(diào)用runner的run()方法。 */ inner.start(); classInnerThread2extendsThread{ publicInnerThread2(){ super(); } publicInnerThread2(Runnablerunnable){ super(runnable); } @Override publicvoidrun(){ //此處代碼輸出 System.out.println("InnerThread2->Override->run()"); } } /* *此處InnerThread2{}為局部內(nèi)部類,即定義在方法中,代碼按照順序執(zhí)行, *所以若要?jiǎng)?chuàng)建該類的對(duì)象,則必須在該類的聲明代碼以后執(zhí)行創(chuàng)建代碼。 *執(zhí)行過程為ThreadPractice{}類加載成員屬性,加載main方法,main方法中依次執(zhí)行對(duì)應(yīng)的代碼。 */ InnerThread2inner2=newInnerThread2(runner); inner2.start(); } voidtest(){ /* *在非main()方法中,或其他任意非static方法中,均可直接創(chuàng)建內(nèi)部類的對(duì)象;因?yàn)榉庆o態(tài)方法的調(diào)用,必須由外部類的對(duì)象進(jìn)行調(diào)用, *即創(chuàng)建了外部類的對(duì)象(此時(shí)會(huì)加載內(nèi)部類到內(nèi)存中)以后,可任意調(diào)用該test()方法,在本方法中創(chuàng)建內(nèi)部類的對(duì)象。 *此種情況即是android應(yīng)用程序中activity的onCreate()方法創(chuàng)建內(nèi)部類對(duì)象的情況。 */ InnerThread1in=newInnerThread1(); in.start(); } classInnerThread1extendsThread{ publicInnerThread1(){ super(); } publicInnerThread1(Runnablerunnable){ super(runnable); } //@Override //publicvoidrun(){ ////此處代碼輸出 //System.out.println("InnerThread1->Override->run()"); //} }}2016-06-03線程通訊->線程同步協(xié)作定義:多個(gè)線程并發(fā)執(zhí)行時(shí),實(shí)現(xiàn)線程之間的交互。即互斥的線程之間通訊。借助Object類的wait(),notify(),notifyAll()方法。線程通訊應(yīng)用-前提/實(shí)現(xiàn)有共享數(shù)據(jù)集;多線程之間互斥(同步代碼塊or同步方法)->對(duì)共享數(shù)據(jù)集加鎖;執(zhí)行對(duì)象鎖的通訊方法(wait(),notify(),notifyAll());Note:調(diào)用這些通訊方法時(shí),使用創(chuàng)建synchronized代碼塊或方法時(shí)候的對(duì)象鎖來調(diào)用。單例模式定義:單例模式是設(shè)計(jì)模式中的一種設(shè)計(jì)方法;主要用于設(shè)計(jì)對(duì)象的創(chuàng)建問題,如何創(chuàng)建?如何獲得?類的外部不能直接創(chuàng)建該類對(duì)象,但可通過該類的靜態(tài)方法獲得對(duì)象,且獲得的對(duì)象有且只有一個(gè)。單例模式應(yīng)用場景舉例:Windows任務(wù)管理器;字符串池;常量池;系統(tǒng)日志;單例模式的實(shí)現(xiàn):構(gòu)造方法私有化;類內(nèi)部創(chuàng)建對(duì)象;提供靜態(tài)方法返回實(shí)例;靜態(tài)初始化類對(duì)象,靜態(tài)方法直接返回。線程安全、效率高但占用內(nèi)存空間。使用場景:小對(duì)象,經(jīng)常用的對(duì)象;靜態(tài)方法中判斷是否為null,依據(jù)結(jié)果創(chuàng)建對(duì)象,并返回對(duì)象。如果單線程訪問,不考慮線程同步的安全問題;多線程訪問,則需要使用synchronized關(guān)鍵字修飾該靜態(tài)方法,保證線程安全。但節(jié)省內(nèi)存空間。使用場景:大對(duì)象,不常用的對(duì)象;線程內(nèi)部單例在每個(gè)線程內(nèi)部,某個(gè)類的對(duì)象在某一時(shí)刻只能有一個(gè)。實(shí)現(xiàn)思想:當(dāng)對(duì)象創(chuàng)建以后,可以將對(duì)象綁定到當(dāng)前線程上。具體實(shí)現(xiàn):借助ThreadLocal{}類,此類中提供set()方法能夠?qū)?duì)象綁定到當(dāng)前線程,也可以通過get()方法從當(dāng)前線程獲取對(duì)象。Note:方法1)為餓漢式單例模式,2)為懶漢式單例模式3)線程內(nèi)部單例模式?;仡?>靜態(tài)修飾符詳解staticStatic修飾符修飾內(nèi)部類(不能修飾外部類);修飾屬性(field)(類的內(nèi)部,方法外部的變量),而不是變量,變量包含全部變量和局部變量,所以只能修飾全局變量;修飾方法;類加載時(shí),即將類讀到內(nèi)存過程中(編譯),順序執(zhí)行:在代碼區(qū),分配類存儲(chǔ)空間;按照代碼撰寫順序初始化類變量,執(zhí)行靜態(tài)代碼塊;執(zhí)行main方法2016-06-06FAQ?Android中工作主線程獲得數(shù)據(jù)以后如何傳遞給主線程?Ex:工作線程通過網(wǎng)絡(luò)下載圖片,通過主線程將圖片更新到頁面上。下載為耗時(shí)操作,子線程無法更新UI。Android中主線程的數(shù)據(jù)如何傳遞給工作線程?例如:主線程將要下載的文件名稱傳遞給工作線程,由工作線程執(zhí)行耗時(shí)操作。Android線程通訊的消息模型作用:線程之間進(jìn)行數(shù)據(jù)傳遞。借助以下對(duì)象:Message{}消息對(duì)象:數(shù)據(jù)的載體MessageQueue{}–消息隊(duì)列:存儲(chǔ)多個(gè)消息對(duì)象Looper{}–迭代器對(duì)象:迭代消息隊(duì)列Handler{}-消息處理對(duì)象:發(fā)送、處理消息數(shù)據(jù)消息對(duì)象的偽代碼實(shí)現(xiàn)classMessage{Objectobj;//借助該屬性存儲(chǔ)數(shù)據(jù),因數(shù)據(jù)類型未知,固使用Object對(duì)象}classMessageQueue{//FIFOLinkedList<Message>list=newLinkedList<Message>();//存儲(chǔ)消息對(duì)象的隊(duì)列}classLooper{//迭代隊(duì)列,需要傳入消息隊(duì)列 MessageQueuemq;//存儲(chǔ)Message對(duì)象集合,即想要傳遞的數(shù)據(jù)集合publicvoidloop(){//循環(huán)迭代消息隊(duì)列}publicvoidexit(){//退出循環(huán)}}ClassHandler{//迭代隊(duì)列后處理消息(發(fā)送、處理)PublicvoidsendMessage(Messagemsg){}PublicvoidhandleMessage(Messagemsg){}}Android中線程通訊的實(shí)現(xiàn)–借助消息模型工作線程->主線程關(guān)鍵點(diǎn):工作線程中獲得與主線程相關(guān)聯(lián)的Looper對(duì)象,主線程默認(rèn)存在Looper對(duì)象,可使用getMainLooper()獲得;主線程->工作線程主線程獲得與工作線程關(guān)聯(lián)的Looper對(duì)象,但子線程默認(rèn)沒有Looper對(duì)象,如何獲得?自己創(chuàng)建。Looper構(gòu)造方法為私有!通過調(diào)用Looper.prepare()&Looper.myLooper()方法獲得子線程的Looper對(duì)象。注意,獲得looper后要執(zhí)行l(wèi)oop()方法,即循環(huán)遍歷消息隊(duì)列MessageQueue,檢索是否有消息存在,有則讀取。創(chuàng)建handler時(shí),需要重寫其handleMessage()方法,執(zhí)行消息處理的代碼。線程消息模型FAQ一個(gè)線程有幾個(gè)looper
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年電子槍鍍膜機(jī)項(xiàng)目發(fā)展計(jì)劃
- 1條形統(tǒng)計(jì)圖(教學(xué)設(shè)計(jì))-2024-2025學(xué)年四年級(jí)上冊數(shù)學(xué)人教版
- 《分糖果》(教學(xué)設(shè)計(jì))-2024-2025學(xué)年北師大版數(shù)學(xué)二年級(jí)上冊
- 多元化教學(xué)活動(dòng)的設(shè)計(jì)與開展計(jì)劃
- 學(xué)校社團(tuán)發(fā)展規(guī)劃計(jì)劃
- 品牌戰(zhàn)略規(guī)劃的系統(tǒng)思考計(jì)劃
- 2025年畫具畫材合作協(xié)議書
- 2025年渠道推廣合作協(xié)議
- 科技公司用到的合同(2025年版)
- 2025年雙酚A合作協(xié)議書
- 銀行網(wǎng)點(diǎn)裝飾裝修施工組織設(shè)計(jì)(134頁)
- 部編版二年級(jí)語文下冊第七單元教材分析研讀
- 小微企業(yè)信貸業(yè)務(wù)培訓(xùn).
- 地理信息安全在線培訓(xùn)考試-填空題
- 植物保護(hù)結(jié)業(yè)試題
- 小學(xué)語文一年級(jí)下冊單元綜合測試題及答案全冊
- 爆破安全規(guī)程試題
- 超市每月活動(dòng)促銷的時(shí)間及主題
- 景德鎮(zhèn)物業(yè)管理服務(wù)收費(fèi)管理實(shí)施細(xì)則
- 海德漢系統(tǒng)數(shù)控機(jī)床調(diào)試資料
- CAMDS-操作手冊范本
評(píng)論
0/150
提交評(píng)論