1. 程式人生 > >Java 線程--繼承java.lang.Thread類實現線程

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

機制 定義 block start pan nds ++ pla 兩種

現實生活中的很多事情是同時進行的,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類實現線程