黑馬程式員——java基礎---多線程

來源:互聯網
上載者:User

標籤:

------Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流! -------

  學習多線程之前,需對以下幾個概念有所認知:

    進程:進程是動態、是一個正在執行中的程式。每一個進程執行都有一個執行順序,該順序是一個執行路徑,或者叫一個控制單元。

    線程:線程依附於進程,可以理解為進程下的一個子執行路徑,但沒有進程線程無法單獨執行。

    兩者間的區別:進程是重量級的電腦任務,需要給它分配獨立的地址空間和系統資源等。不同進程的內部資料和狀態都是完全獨立,所以不同進程之間的通訊或轉換是需要承受負擔的;而線程則屬於輕量級的任務,不同線程執行過程中所需的系統資源則由進程進行統一分配,所以同一進程的不同線程執行過程中是會相互影響的,而且線程本身的資料通常放於寄存器,或者是程式執行時所使用的堆棧中,所以線程切換的負擔要比進程切換小的多。

    單線程:如果某個程式執行過程中,進程下只有唯一的一條線程,那麼這便是單線程。

    多線程:如果某個程式執行過程中,進程下有不同的線程在執行各自的任務,那麼這就是多線程。

  瞭解了以上概念,那麼第一個問題就出現了。電腦為什麼要使用多線程來執行任務呢?答案很簡單,因為多線程單位時間內執行的任務量比單線程大,而且對電腦CPU而言,單線程無疑會造成CPU的極度浪費。

 

  那麼多線程在Java中是如何體現的?

    1、同其他大多數程式設計語言不同,Java內建支援多線程編程(Multithreaded Programming)。

      2、多線程程式中包含兩條或兩條以上並發啟動並執行部分,程式中每個這樣的部分都叫做一個線程。每個線程都有獨立的執行路徑,因此多線程是多任務處理的一種特殊形式。

  多任務處理被所有的現代作業系統所支援。但是,多任務處理卻有兩種截然不同的類型:基於進程的和基於線程的。

    基於進程:進程本質上是一個執行的程式。因此基於進程的多任務處理的特點是允許你的電腦同時運行兩個或更多的程式。所以在基於進程的多任務處理中,程式是發送器所指派的最小代碼單位。例如:我們可以一邊聽音樂,一邊在QQ上聊天。

    基於線程:在該多任務處理環境中,線程是最小的執行單位。這意味著一個程式具有同時執行兩個或者多個任務的功能。例如:我們開啟一個QQ軟體,可以同時和多個人聊天。

 

  線程的一些狀態以及不同狀態間的轉換方式:

  Java中的線程大體可分為五種狀態:

      1、建立:這種情況指的是,通過New關鍵字建立了Thread類(或其子類)的對象

    2、就緒:當一個線程建立了以後,其他的線程調用了它的start()方法,該線程就進入了就緒狀態。處於這個狀態的線程位於可運行池中,等待獲得CPU的使用權。

    3、運行:這時的線程指的是獲得CPU的就緒線程,運行狀態是所有線程都希望獲得的狀態。

    4、死亡:處於運行狀態的線程,在執行完run()方法之後,就變成了DEAD狀態了。

    5、阻塞:這種狀態指的是處於運行狀態的線程,出於某種原因,比如調用了sleep()方法、等待使用者輸入等而讓出當前的CPU給其他的線程。

  不同狀態間的轉換:

  一、建立並運行線程

      當調用start()方法後,線程開始執行run()方法中的代碼。線程進入運行狀態。可以通過Thread類的isAlive()方法來判斷線程是否處於運行狀態。當線程處於運行狀態時,isAlive()返回true,當isAlive()返回false時,可能線程處於等待狀態,也可能處於停止狀態。

  二、掛起和喚醒線程
    一但線程開始執行run()方法,就會一直到這個run()方法執行完成這個線程才退出。但線上程執行的過程中,可以通過兩個方法使線程暫時停止執行。這兩個方法是suspend()和sleep()。在使用suspend()掛起線程後,可以通過resume()方法喚醒線程。而使用sleep()使線程休眠後,只能在設定的時間後使線程處於就緒狀態(線上程休眠結束後,線程不一定會馬上執行,只是進入了就緒狀態,等待著系統進行調度)。雖然suspend()和resume()可以很方便地使線程掛起和喚醒,但由於使用這兩個方法可能會造成一些不可預料的事情發生,因此,這兩個方法被標識為deprecated標記,這表明在以後的jdk版本中這兩個方法可能被刪除,所以盡量不要使用這兩個方法來操作線程。

  三、終止線程的三種方法:
    1、使用退出標誌,使線程正常退出,也就是當run()方法完成後線程終止。
    2、使用stop()方法強行終止線程(這個方法不推薦使用,因為stop()和suspend()、resume()一樣,也可能發生不可預料的結果)。
    3、使用interrupt()方法中斷線程

 

  Java中線程的建立:

    一、繼承Thread類

    步驟:1、定義類繼承Thread  2、複寫Thread類的run()方法  3、建立新定義類的對象  4、調用start()方法啟動線程

代碼實現:

 

 1 package come.file; 2  3 //1、定義TestThread類繼承Thread類 4 class TestThread extends Thread{ 5     //2、複寫Thread類的run()方法 6     public void run(){ 7         System.out.println("這是TestThread類"); 8     } 9 }10 public class MyThread{11     public static void main(String[] args){12         //建立新定義的TestThread類的對象13         TestThread t = new TestThread();14         //調用start()方法15         t.start();16     }17 }

  二、實現Runnable介面

  步驟:1、建立類實現Runnable介面 2、複寫run()方法  3、調用new Thread(runnable)方式建立線程  4、調用start()方法啟動線程

代碼實現:

 

 1 package come.file; 2  3 //1、建立類實現Runnable介面 4 class TestThread2 implements Runnable { 5     //2、複寫run()方法 6     public void run(){ 7         System.out.println("這是TestThread2類"); 8     } 9 }10 public class MyThread2 {11     public static void main(String[] args) {12         //3、調用new Thread(runnable)方式建立線程13         Thread t2 = new Thread(new TestThread2());14         //4、調用start()方法啟動線程15         t2.start();16     }17 }

 

  注意:

    1、在繼承Thread的方式中,可以使用getName()方法,來獲得當前線程的名字,這是因為在Thread類中,有這個方法。可是在實現Runnable方式中,卻不可以使用this.getName(),因為Runnable介面沒有這個方法(可以看出來,因為我們沒有提示我們需要重寫這個方法),所以只能通過Thread的靜態方法Thread.currentThread()取得當前的Thread對象,在調用getName()方法,來取得當前線程的名字。

    2、對Java來說,run()方法沒有任何特別之處。像main()方法一樣,它只是新線程知道調用的方法名稱。因此,在Runnable上或者Thread上調用run方法是合法的。但並不啟動新的線程。只有調用start()方法才會啟動新線程。

  Final:比較總結

  通過對比兩種方式,我們可以發現Runnable介面方式要優於繼承Thread類方式。因為前者實現了介面後還可以繼承其他的類,而且在這種情況下,多個線程來共用一個Runnable target對象,非常適合多個相同線程來處理同一份資源的情況,從而可以將CPU、代碼和資料分開,形成清晰的模型,較好的體現了物件導向的思想。

 

    

 

 

   

 

  

黑馬程式員——java基礎---多線程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.