進程和線程的概念
什麼是進程
一個進程就是在一個運行的程序 它有自己獨立的內存空間 一組系統資源 每個進程的內部數據和狀態都是獨立的 例如在window是同時打開多個記事本 雖然它們所運行的程序代碼都是一樣的 但是所使用的內存空間是獨立的 互不幹擾
什麼是線程
線程與進程相似 是一段完成某個特定功能的代碼 是程序中單個順序的流控制;但與進程不同的是 同類的多個線程共享一塊內存空間和一組系統資源 而線程本身的數據通常只有微處理器的寄存器數據 以及一個供程序執行時使用的堆棧
進程與線程的區別
進程:每個進程都有獨立的代碼和數據空間(進程上下文) 進程切換的開銷大
線程:輕量的進程 同一類線程共享代碼和數據空間 每個線程有獨立的運行棧和程序計數器(PC) 線程切換的開銷小
多進程:在操作系統中 能同時運行多個任務程序
多線程:在同一應用程序中 有多個順序流同時執行
線程創豎態梁建的兩種方式
採用繼承Thread類創建線程
該方法比較簡單 主要是通過繼承java lang Thread類 並覆蓋Thread類的run()方法來完成線成的創建 Thread 類是一個具體的閉悄類 即不是抽象類 該類封裝了線程的行為 要創建一個線程 程序員必須創建一個從 Thread 類導出的新類 Thread類中有兩個最重要的函數run()和start()
通過實現Runnable介面創建線程
該方法通過生成實現java lang Runnable介面的類 該介面只定義了一個方法run() 所以必須余運在新類中實現它 但是 Runnable 介面並沒有任何對線程的支持 我們還必須創建 Thread 類的實例 這一點通過 Thread 類的構造函數
public Thread(Runnable target);來實現
單線程和多線程性能比較
以使用蒙特卡羅概率演算法求π為例 進行單線程和多線程時間比較
什麼是蒙特卡羅概率演算法
蒙特卡羅法(Monte Carlo method)是以概率和統計的理論 方法為基礎的一種計算方法 將所求解的問題同一定的概率模型相聯系 用電子計算機實現統計模擬或抽樣 以獲得問題的近似解 故又稱統計模擬法或統計試驗法 網路
蒙特卡羅求演算法求π
第一步
畫正方形和內切圓
第二步
變換表達式
正方形面積As=( R)^
圓的面積Ac=πR^
Ac/As=( R)^ /πR^
π= As/Ac
令P=As/Sc 則π= P
第三步
重復N次實驗求平均值
在正方形區域內隨機生成一個點A 若A落在圓區域內 M++
P=M/N
π= P N的取值越大 π的值越精確
java代碼實現演算法
N取值為 萬 多線程的數為 每個線程執行 萬次模擬實驗
線程實現
import ncurrent CountDownLatch;
public class ProModel implements Runnable {
public int N;//隨機實驗的總次數
public static int M;//隨機點落在圓中的次數
private int id;
private final CountDownLatch doneSignal;
OBJ semaphore;
public ProModel(int id CountDownLatch doneSignal int N OBJ semaphore ){
this id=id;
this doneSignal=doneSignal;
this N=N;
this semaphore=semaphore ;
M= ;
}
public void run(){
int tempM= ;
for(int i= ;i<N;i++){
if(isInCircle()){
tempM++;
}
}
synchronized (semaphore) {
add(tempM);
}
untDown();//使end狀態減
}
public void add(int tempM){
System out println(Thread currentThread() getName());
M=M+tempM;
System out println(M);
}
//隨機產生一個在正方形區域的點 判斷它是否在圓中
public boolean isInCircle(){
double x=Math random();
double y=Math random();
if((x )*(x )+(y )*(y )< )
return true;
else
return false;
}
public static int getTotal(){
return M;
}
}
多線程Main實現
import ncurrent CountDownLatch;
import ncurrent ExecutorService;
import ncurrent Executors;
public class MutliThread {
public static void main(String[] args) throws InterruptedException {
long begin=System currentTimeMillis();
int threadSize= ;
int N= ;
OBJ semaphore = new OBJ();
CountDownLatch doneSignal = new CountDownLatch(threadSize);
ProModel[] pros=new ProModel[threadSize];
//設置特定的線程池 大小為threadSizde
System out println( begins! );
ExecutorService exe = Executors newFixedThreadPool(threadSize);
for(int i= ;i<threadSize;i++)
exe execute(new ProModel(i+ doneSignal N semaphore));
try{
doneSignal await(); //等待end狀態變為 }catch (InterruptedException e) {
// TODO: handle exception
e printStackTrace();
}finally{
System out println( ends! );
System out println( *(float)ProModel getTotal()/(float)(threadSize*N));
}
exe shutdown();
long end=System currentTimeMillis();
System out println( used time(ms): +(end begin));
}
}
class OBJ{}
單線程Main實現
import ncurrent CountDownLatch;
import ncurrent ExecutorService;
import ncurrent Executors;
public class SingleThread {
public static void main(String[] args) {
long begin=System currentTimeMillis();
int threadSize= ;
int N= ;
OBJ semaphore = new OBJ();
CountDownLatch doneSignal = new CountDownLatch(threadSize);
ProModel[] pros=new ProModel[threadSize];
//設置特定的線程池 大小為
System out println( begins! );
ExecutorService exe = Executors newFixedThreadPool(threadSize);
for(int i= ;i<threadSize;i++)
exe execute(new ProModel(i+ doneSignal N semaphore));
try{
doneSignal await(); //等待end狀態變為 }catch (InterruptedException e) {
// TODO: handle exception
e printStackTrace();
}finally{
System out println( ends! );
System out println( *(float)ProModel getTotal()/(float)(threadSize*N));
}
exe shutdown();
long end=System currentTimeMillis();
System out println( used time(ms): +(end begin));
}
}
運行結果比較
lishixin/Article/program/Java/gj/201311/27648
⑵ 學安卓開發的話難不難和java比哪個好學
閱讀進階書籍,閱讀Android源碼,閱讀官方文檔並嘗試自己寫相關的技術文章,需要有一定技術深度和自我思考。在這個階段的學習過程中,有2個點是比較困擾大家的,一個是閱讀源碼,另一個是自定義View以及滑動沖突。
如何閱讀源碼呢?這是個頭疼的問題,但是源碼必須要讀。閱讀源碼的時候不要深入代碼細節不可自拔,要關注代碼的流程並盡量挖掘出對應用層開發有用的結論。另外仔細閱讀源碼中對一個類或者方法的注釋,在看不懂源碼時,源碼中的注釋可以幫你更好地了解源碼中的工作原理,這個過程雖然艱苦,但是別無他法。
如何玩轉自定義View呢?我的建議是不要通過學習自定義view而學習自定義view。為什麼這么說呢?因為自定義view的種類太多了,各式各樣的絢麗的自定義效果,如何學的玩呢!我們要透過現象看本質,更多地去關注自定義view所需的知識點,這里做如下總結:
- 搞懂view的滑動原理
- 搞懂如何實現彈性滑動
- 搞懂view的滑動沖突
- 搞懂view的measure、layout和draw
- 然後再學習幾個已有的自定義view的例子
- 最後就可以搞定自定義view了,所謂萬變不離其宗
大概再需要1-2年時間,即可達到高級工程師的技術水平。我個人認為通過《Android開發藝術探索》和《Android群英傳》可以縮短這個過程為0.5-1年。注意,達到高級工程師的技術水平不代表就可以立刻成為高級工程師(受機遇、是否跳槽的影響),但是技術達到了,成為高級工程師只是很簡單的事。
技術要求:
- 稍微深入的知識點
AIDL、Messenger、Binder、多進程、動畫、滑動沖突、自定義View、消息隊列等
- 書籍推薦
《Android開發藝術探索》、《Android群英傳》