原创 Android 線程與線程池 Thread&ThreadPool

1. 線程Thread 學過計算機的人都知道,什麼是Thread。對於計算機來說,Thread是最小的執行單元。做過Android開發的人都知道,我們開發的App至少存在一個線程,那就是主線程。那麼如果我們想要執行耗時的任務的話,

原创 淺談Android Service與IntentService的區別

service大家估計比較清楚了,是Android 的四大組件之一,如果你不瞭解,請百度Android四大組件。 至於什麼是IntentService,估計很多人都很陌生,筆者也是,最近在做一個項目,於是接觸到了Intentservci

原创 Java併發編程番外篇(一)如何結束一個線程

本篇博客介紹下如何結束一個線程。在Java 的設計中,當一個線程的run方法中代碼執行結束後,該線程就自動結束了。但是,在我們的實際開發過程中,可能會需要手動的結束一個線程,此時我們應該怎麼安全地結束一個線程呢? 1. stop方法 根據

原创 Java併發編程(七)高級別併發對象

7. 高級別併發對象 到目前爲止,本課程介紹了一些Java平臺初學者必須的低級別API。這些API對於簡單的任務足夠了,但是負責的任務需要一些高級別的構建塊。這對於利用現在的多處理器和多核系統的大規模併發應用更加正確。 在本節,我們將要介

原创 Java併發編程番外篇(三)volatile變量、happens-before與內存一致性錯誤

Java併發編程番外篇(三)volatile變量、happens-before與內存一致性錯誤 volatile變量 volatile是Java的關鍵詞,我們可以用它來修飾變量或者方法。 爲什麼要使用volatile volatile的典

原创 Java併發編程番外篇(二)happens-before關係

在Java 併發編程(三)同步中,提到了內存一致性錯誤,而避免內存一致性錯誤的關鍵就是了解happens-before關係。那麼什麼是happens-before關係呢?如何判斷兩個操作是否存在happends-before關係呢?本文將

原创 Java 併發編程(一)進程與線程

本篇博客介紹下進程與線程的區別。 1. 進程與線程 在現有的併發編程中,有兩個重要的執行單元:進程與線程。在Java變成語言中,與併發編程相關的通常是線程。然而,進程也同樣重要。 一個計算機系統通常會有許多的活動進程和線程。即使當系統只有

原创 Java併發編程(四)活躍度

4. 活躍度 一個併發應用及時執行的能力稱作活躍度。本節介紹最常見的活躍度問題,死鎖,然後繼續簡單介紹兩種其他的活躍度問題,飢餓和活鎖。 4.1 死鎖 死鎖介紹了兩個或者多個線程永遠阻塞、彼此等待的情形。這是一個例子, Alphonse

原创 Java同步容器與併發容器

Java容器 Java提供了很多容器類,方便用戶使用。關鍵接口圖如下(圖片來源自The Java™ Tutorials), Collection——集合框架結構的根節點。Java並沒有提供該接口的具體實現,但是提供了Collecti

原创 Android Stuido 使用cMake構建NDK項目

Android Stuido 使用cMake構建NDK項目 不覺得,Android studio(as)已經面市好多年了,記得13年筆者剛開始接觸Android的時候,as還是試用版本,現在as發展地如火如荼,正在逐漸地取代之前的Andr

原创 Java併發編程(五)保護塊

5. 保護塊 線程通常需要協調任務。最常用的協調方法是保護塊(guarded block)。這樣一個塊以一個條件開始,如果該條件爲真,則該塊的代碼得以執行。這樣做需要遵循一些步驟。 假設,guardedJoy是一個方法,該方法不會執行直到

原创 Java併發編程(六)不可改變對象

6. 不可改變對象 如果一個對象在創建後不可改變,那麼就稱之爲不可改變對象。基於不可變對象被廣泛接受爲創建簡單、可靠代碼的有效策略。 不可變對象在併發程序中顯得尤爲重要。由於它們不能改變,所以他們不會在線程干擾中出現錯誤,並且不會出現非一

原创 Java併發編程(二)多線程編程

在上一節,我們介紹了進程與線程的概念,接下來介紹如何使用多線程(暫不介紹多進程)。 2. Thread對象 每個線程都對應一個Thread實例,存在兩種策略使用Thread類來創建併發程序。 直接進行線程的創建和管理,也就是當需要開啓一

原创 Java併發編程(三)同步

Java併發編程(三)同步 3. 同步 線程主要通過共享內存(成員變量)來進行通信。這種形式的交流很有效率,但是可能會導致兩種錯誤:線程干擾和內存一致性錯誤。預防這些錯誤的方式就是同步。 然而,同步會導致線程競爭,線程競爭會導致多個線程在

原创 Android JNI Java類型簽名

JNI提供了Java和native代碼相互交互的接口,當我們在底層訪問Java類的域(成員變量)或者方法時,需要提供域或者方法描述符,比如,下面代碼, (*env)->GetFieldID(env, clzz, fieldName, fi