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