Java 線程--繼承java.lang.Thread類實現線程

來源:互聯網
上載者:User

標籤:display   ++   inf   lan   test   java 線程   png   convert   子類   

現實生活中的很多事情是同時進行的,Java中為了類比這種狀態,引入了線程機制。先來看線程的基本概念。

線程是指進程中的一個執行情境,也就是執行流程,進程和線程的區別:

1.每個進程是一個應用程式,都有獨立的記憶體空間。

2.同一個進程中的線程共用其進程中的記憶體和資源。

(共用的記憶體是堆記憶體和方法區記憶體,棧記憶體不共用,每個線程有自己的棧記憶體)

 

我們還需要瞭解以下基本內容:

1.什麼是進程?

一個進程對應一個應用程式。例如:在Windows作業系統啟動word就表示啟動了一個進程。在Java開發環境下啟動JVM,就表示啟動了一個進程。現在的電腦都是支援多進程的,在同一個作業系統中,可以同時啟動多個進程。

2.多進程有什麼作用?

單進程電腦只能做一件事情。

玩電腦,一邊打遊戲(遊戲進程)一邊聽音樂(音樂進程)。

對於單核電腦來講,在同一個時間點上,遊戲進程和音樂進程是在同時運行嗎?   不是。

因為電腦的CPU只能在某個時間點上做一件事情。由於電腦將在“遊戲進程”和“音樂進程”之間頻繁地切換執行,切換速度極高,人類感覺遊戲和音樂同時在進行。

多進程的作用不是提高執行速度,而是提高CPU的使用率。

進程和進程之間的記憶體是獨立的。

3.什麼是線程?

線程是一個進程中的執行情境。一個進程可以啟動多個線程。

4.多線程有什麼作用?

多線程不是為了提高執行速度,而是提高應用程式的使用率。

線程和線程共用“堆記憶體和方法區記憶體”,棧記憶體是獨立的,一個線程一個棧。

5.Java程式的運行原理?

Java命令會啟動Java虛擬機器,啟動JVM,等於啟動了一個進程,該進程會自動啟動一個“主線程”,然後主線程去調用某個類的main方法,所以main方法運行在主線程中。在此之前的所有程式都是單線程的。

理論知識有了,接下來試著分析以下程式有幾個線程?

 

public class ThreadTest01{
 public static void main(String[] args){
   m1();
 }
 public static void m1(){    
   m2();
 }
 public static void m2(){
   m3();
 }
 public static void m3(){
   System.out.println("asfs");
 }
}

 

上面程式只有一個線程,就是主線程。main()方法調m1();m1()調m2();m2()調m3(),所以main()方法以及m1();m2();m3();方法在同一個棧中。由於進程與進程的棧是獨立的,所以只有一個進程。

 

在Java中實現線程的兩種方式,分別為繼承java.lang.Thread類與實現java.lang.Runnable介面。先來看第一種實現方式。

第一步:繼承java.lang.Thread;

第二步:重寫run方法。

具體過程看以下代碼。

 

public class ThreadTest02{
 public static void main(String[] args){
   //建立線程(多態:父類型引用指向子類型對象)
   Thread t=new Processor();
   //啟動
   t.start();  
   for(int j=0;j<10;j++){
     System.out.println("main--->"+j);
   }
 }
}
//自訂一個線程
class Processor extends Thread{
 //重寫run方法
 public void run(){
   for(int i=0;i<100;i++){
     System.out.println("run--->"+i);
   }
 }
}

 

繼承類java.lang.Thread;方式實現線程主要分為三步,1.自訂一個線程; 2.建立線程; 3.啟動線程;

通過下面這張圖來看JVM的工作原理。

 

在上面的代碼中,

1.首先自訂線程Processor, 建立線程Thread t=new Processor();屬於多態,即父類型引用指向子類型對象。

2.啟動線程。t.start(); 這段線程執行瞬間結束,告訴JVM再分配一個棧給t線程。而且run方法不需要程式員手動調用,系統線程啟動之後自動調用run方法。

3.以上這個程式有兩個線程,一個主線程,一個自訂線程。有了多線程之後,main方法結束只是主線程棧中沒有方法棧幀了。但是其他棧中還有棧幀。main方法結束,程式可能還在執行。

4.如果只是使用普通方法調用run方法,即t.run(); 則只有一個線程,run方法只要還沒結束,緊跟著的for迴圈就不會執行。

Java 線程--繼承java.lang.Thread類實現線程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.