線程的阻塞
為了解決對(duì)同享存儲(chǔ)區(qū)的訪問(wèn)沖突,Java 引入了同步機(jī)制,現(xiàn)在讓我們來(lái)考察多個(gè)線程對(duì)同享資源的訪問(wèn),明顯同步機(jī)制已不夠了,由于在任意時(shí)刻所要求的資源不1定已準(zhǔn)備好了被訪問(wèn),反過(guò)來(lái),同1時(shí)刻準(zhǔn)備好了的資源也可能不止1個(gè)。為了解決這類(lèi)情況下的訪問(wèn)控制問(wèn)題,Java 引入了對(duì)阻塞機(jī)制的支持.
阻塞指的是暫停1個(gè)線程的履行以等待某個(gè)條件產(chǎn)生(如某資源就緒),學(xué)過(guò)操作系統(tǒng)的同學(xué)對(duì)它1定已很熟習(xí)了。Java 提供了大量方法來(lái)支持阻塞,下面讓我們逐1分析。
初看起來(lái)它們與 suspend() 和 resume() 方法對(duì)沒(méi)有甚么分別,但是事實(shí)上它們是截然不同的。區(qū)分的核心在于,前面敘述的所有方法,阻塞時(shí)都不會(huì)釋放占用的鎖(如果占用了的話),而這1對(duì)方法則相反。上述的核心區(qū)分致使了1系列的細(xì)節(jié)上的區(qū)分。
首先,前面敘述的所有方法都隸屬于 Thread 類(lèi),但是這1對(duì)卻直接隸屬于 Object 類(lèi),也就是說(shuō),所有對(duì)象都具有這1對(duì)方法。初看起來(lái)這10分不可思議,但是實(shí)際上卻是很自然的,由于這1對(duì)方法阻塞時(shí)要釋放占用的鎖,而鎖是任何對(duì)象都具有的,調(diào)用任意對(duì)象的 wait() 方法致使線程阻塞,并且該對(duì)象上的鎖被釋放。而調(diào)用 任意對(duì)象的notify()方法則致使因調(diào)用該對(duì)象的 wait() 方法而阻塞的線程中隨機(jī)選擇的1個(gè)消除阻塞(但要等到取得鎖后才真正可履行)。
其次,前面敘述的所有方法都可在任何位置調(diào)用,但是這1對(duì)方法卻必須在 synchronized 方法或塊中調(diào)用,理由也很簡(jiǎn)單,只有在synchronized 方法或塊中當(dāng)前線程才占有鎖,才有鎖可以釋放。一樣的道理,調(diào)用這1對(duì)方法的對(duì)象上的鎖必須為當(dāng)前線程所具有,這樣才有鎖可以釋放。因此,這1對(duì)方法調(diào)用必須放置在這樣的 synchronized 方法或塊中,該方法或塊的上鎖對(duì)象就是調(diào)用這1對(duì)方法的對(duì)象。若不滿足這1條件,則程序雖然仍能編譯,但在運(yùn)行時(shí)會(huì)出現(xiàn)IllegalMonitorStateException 異常。
wait() 和 notify() 方法的上述特性決定了它們常常和synchronized 方法或塊1起使用,將它們和操作系統(tǒng)的進(jìn)程間通訊機(jī)制作1個(gè)比較就會(huì)發(fā)現(xiàn)它們的類(lèi)似性:synchronized方法或塊提供了類(lèi)似于操作系統(tǒng)原語(yǔ)的功能,它們的履行不會(huì)遭到多線程機(jī)制的干擾,而這1對(duì)方法則相當(dāng)于 block 和wakeup 原語(yǔ)(這1對(duì)方法均聲明為 synchronized)。它們的結(jié)合使得我們可以實(shí)現(xiàn)操作系統(tǒng)上1系列精巧的進(jìn)程間通訊的算法(如信號(hào)量算法),并用于解決各種復(fù)雜的線程間通訊問(wèn)題。
談到阻塞,就不能不談1談死鎖,略1分析就可以發(fā)現(xiàn),suspend() 方法和不指定超時(shí)期限的 wait() 方法的調(diào)用都可能產(chǎn)生死鎖。遺憾的是,Java 其實(shí)不在語(yǔ)言級(jí)別上支持死鎖的避免,我們?cè)诰幊讨斜仨氈?jǐn)慎地避免死鎖。
http://www.cnblogs.com/yuanermen/archive/2009/08/05/1539917.html
http://alexyyek.github.io/2015/04/06/Collection/http://tianmaying.com/tutorial/java_collection
http://www.cnblogs.com/chenssy/p/3388487.html
http://www.233.com/ncre2/JAVA/jichu/20100717/084230917.html
http://lvable.com/?p=217
下面是最近在開(kāi)發(fā)Android相干項(xiàng)目時(shí)的1些心得體會(huì),懶得開(kāi)新貼就1起匯總在這里吧,畢竟都是用Java開(kāi)發(fā)的。
把原數(shù)據(jù)庫(kù)包括在項(xiàng)目源碼的 res/raw。
android系統(tǒng)下數(shù)據(jù)庫(kù)應(yīng)當(dāng)寄存在 /data/data/com..(package name)/ 目錄下,所以我們需要做的是把已有的數(shù)據(jù)庫(kù)傳入那個(gè)目錄下.操作方法是用FileInputStream讀取原數(shù)據(jù)庫(kù),再用FileOutputStream把讀取到的東西寫(xiě)入到那個(gè)目錄.
因廣播數(shù)據(jù)在本利用范圍內(nèi)傳播,不用擔(dān)心隱私數(shù)據(jù)泄漏的問(wèn)題。 不用擔(dān)心別的利用捏造廣播,造成安全隱患。 相比在系統(tǒng)內(nèi)發(fā)送全局廣播,它更高效。
生成1個(gè)默許的且與主線程相互獨(dú)立的工作者線程來(lái)履行所有傳送至onStartCommand() 方法的Intetnt。
生成1個(gè)工作隊(duì)列來(lái)傳送Intent對(duì)象給你的onHandleIntent()方法,同1時(shí)刻只傳送1個(gè)Intent對(duì)象,這樣1來(lái),你就沒(méi)必要擔(dān)心多線程的問(wèn)題。在所有的要求(Intent)都被履行完以后會(huì)自動(dòng)停止服務(wù),所以,你不需要自己去調(diào)用stopSelf()方法來(lái)停止。
該服務(wù)提供了1個(gè)onBind()方法的默許實(shí)現(xiàn),它返回null
提供了1個(gè)onStartCommand()方法的默許實(shí)現(xiàn),它將Intent先傳送至工作隊(duì)列,然后從工作隊(duì)列中每次取出1個(gè)傳送至onHandleIntent()方法,在該方法中對(duì)Intent對(duì)相應(yīng)的處理。
AIDL (Android Interface Definition Language) 是1種IDL 語(yǔ)言,用于生成可以在Android裝備上兩個(gè)進(jìn)程之間進(jìn)行進(jìn)程間通訊(interprocess communication, IPC)的代碼。如果在1個(gè)進(jìn)程中(例如Activity)要調(diào)用另外一個(gè)進(jìn)程中(例如Service)對(duì)象的操作,就能夠使用AIDL生成可序列化的參數(shù)。 AIDL IPC機(jī)制是面向接口的,像COM或Corba1樣,但是更加輕量級(jí)。它是使用代理類(lèi)在客戶端和實(shí)現(xiàn)端傳遞數(shù)據(jù)。
Activity像1個(gè)工匠(控制單元),Window像窗戶(承載模型),View像窗花(顯示視圖) LayoutInflater像剪刀,Xml配置像窗花圖紙。
在Activity中調(diào)用attach,創(chuàng)建了1個(gè)Window。創(chuàng)建的window是其子類(lèi)PhoneWindow,在attach中創(chuàng)建PhoneWindow。在Activity中調(diào)用setContentView(R.layout.xxx)。其中實(shí)際上是調(diào)用的getWindow().setContentView()。調(diào)用PhoneWindow中的setContentView方法。創(chuàng)建ParentView:?作為ViewGroup的子類(lèi),實(shí)際是創(chuàng)建的DecorView(作為FramLayout的子類(lèi))。將指定的R.layout.xxx進(jìn)行填充?通過(guò)布局填充器進(jìn)行填充【其中的parent指的就是DecorView】。調(diào)用到ViewGroup。調(diào)用ViewGroup的removeAllView(),先將所有的view移除掉。添加新的view:addView()。
fragment 特點(diǎn)
Fragment可以作為Activity界面的1部份組成出現(xiàn);可以在1個(gè)Activity中同時(shí)出現(xiàn)多個(gè)Fragment,并且1個(gè)Fragment也能夠在多個(gè)Activity中使用;在Activity運(yùn)行進(jìn)程中,可以添加、移除或替換Fragment;Fragment可以響應(yīng)自己的輸入事件,并且有自己的生命周期,它們的生命周期會(huì)受宿主Activity的生命周期影響。