下面就首先對這兩個名詞區分來作爲本篇博客的開始:
一、線程與進程的區別
多個進程的內部數據和狀態都是完全獨立的,而多線程是共享一塊內存空間和一組系統資源,有可能互相影響. •
線程本身的數據通常只有寄存器數據,以及一個程序執行時使用的堆棧,所以線程的切換比進程切換的負擔要小。
多線程編程的目的,就是"最大限度地利用CPU資源",當某一線程的處理不需要佔用CPU而只和I/O等資源打交道時,讓需要佔用CPU資源的其它線程有機會獲得CPU資源。從根本上說,這就是多線程編程的最終目的。
二、瞭解一下java在多線程中的基礎知識
1.Java中如果我們自己沒有產生線程,那麼系統就會給我們產生一個線程(主線程,main方法就在主線程上運行),我們的程序都是由線程來執行的。
2. 進程:執行中的程序(程序是靜態的概念,進程是動態的概念)。
3. 線程的實現有兩種方式,第一種方式是繼承Thread類,然後重寫run方法;第二種是實現Runnable接口,然後實現其run方法。
4. 將我們希望線程執行的代碼放到run方法中,然後通過start方法來啓動線程,start方法首先爲線程的執行準備好系統資源,然後再去調用run方法。當某個類繼承了Thread類之後,該類就叫做一個線程類。
5. 一個進程至少要包含一個線程。
6. 對於單核CPU來說,某一時刻只能有一個線程在執行(微觀串行),從宏觀角度來看,多個線程在同時執行(宏觀並行)。
7. 對於雙核或雙核以上的CPU來說,可以真正做到微觀並行。
三、Thread源碼研究:
1) Thread類也實現了Runnable接口,因此實現了Runnable接口中的run方法;
2) 當生成一個線程對象時,如果沒有爲其設定名字,那麼線程對象的名字將使用如下形式:Thread-number,該number將是自動增加的,並被所有的Thread對象所共享(因爲它是static的成員變量)。
3) 當使用第一種方式來生成線程對象時,我們需要重寫run方法,因爲Thread類的run方法此時什麼事情也不做。
4)當使用第二種方式生成線程對象時,我們需要實現Runnable接口的run方法,然後使用new Thread(new MyThread())(假如MyThread已經實現了Runnable接口)來生成線程對象,這時的線程對象的run方法或調就會MyThread類的run方法,這樣我們自己編寫的run方法就執行了。
說明:
Public void run(){
If(target!=null){
Target.run();
}}
當使用繼承Thread生成線程對象時,target爲空,什麼也不執行,當使用第二種方式生成時,執行target.run(),target爲runnable的實例對象,即爲執行重寫後的方法
總結:兩種生成線程對象的區別:
1.兩種方法均需執行線程的start方法爲線程分配必須的系統資源、調度線程運行並執行線程的run方法。
2.在具體應用中,採用哪種方法來構造線程體要視情況而定。通常,當一個線程已繼承了另一個類時,就應該用第二種方法來構造,即實現Runnable接口。