標籤:bsp 一個 結束 image 通過 空格 支援 一個人 視窗
第1章
多線程1.1
多線程介紹
學習多線程之前,我們先要瞭解幾個關於多線程有關的概念。
進程:進程指正在啟動並執行程式。確切的來說,當一個程式進入記憶體運行,即變成一個進程,進程是處於運行過程中的程式,並且具有一定獨立功能。
線程:線程是進程中的一個執行單元,負責當前進程中程式的執行,一個進程中至少有一個線程。一個進程中是可以有多個線程的,這個應用程式也可以稱之為多線程程式。
簡而言之:一個程式運行後至少有一個進程,一個進程中可以包含多個線程
什麼是多線程呢?即就是一個程式中有多個線程在同時執行。
通過來區別單線程程式與多線程程式的不同:
l 單線程程式:即,若有多個任務只能依次執行。當上一個任務執行結束後,下一個任務開始執行。如,去網吧上網,網吧只能讓一個人上網,當這個人下機後,下一個人才能上網。
l 多線程程式:即,若有多個任務可以同時執行。如,去網吧上網,網吧能夠讓多個人同時上網。
1.2
程式運行原理
l 分時調度
所有線程輪流使用 CPU 的使用權,平均分配每個線程佔用 CPU 的時間。
l 搶佔式調度
優先讓優先順序高的線程使用 CPU,如果線程的優先順序相同,那麼會隨機播放一個(線程隨機性),Java使用的為搶佔式調度。
1.2.1
搶佔式調度詳解
大部分作業系統都支援多進程並發運行,現在的作業系統幾乎都支援同時運行多個程式。比如:現在我們上課一邊使用編輯器,一邊使用錄屏軟體,同時還開著畫圖板,dos視窗等軟體。此時,這些程式是在同時運行,”感覺這些軟體好像在同一時刻運行著“。
實際上,CPU(中央處理器)使用搶佔式調度模式在多個線程間進行著高速的切換。對於CPU的一個核而言,某個時刻,只能執行一個線程,而 CPU的在多個線程間切換速度相對我們的感覺要快,看上去就是在同一時刻運行。
其實,多線程程式並不能提高程式的運行速度,但能夠提高程式運行效率,讓CPU的使用率更高。
1.3
主線程
回想我們以前學習中寫過的代碼,當我們在dos命令列中輸入java空格類名斷行符號後,啟動JVM,並且載入對應的class檔案。虛擬機器並會從main方法開始執行我們的程式碼,一直把main方法的代碼執行結束。如果在執行過程遇到迴圈時間比較長的代碼,那麼在迴圈之後的其他代碼是不會被馬上執行的。
class Demo{ String name; Demo(String name){ this.name = name; } void show() { for (int i=1;i<=10000 ;i++ ) { System.out.println("name="+name+",i="+i); } }}class ThreadDemo { public static void main(String[] args) { Demo d = new Demo("小強"); Demo d2 = new Demo("旺財"); d.show(); d2.show(); System.out.println("Hello World!"); }}
若在上述代碼中show方法中的迴圈執行次數很多,這時在d.show();下面的代碼是不會馬上執行的,並且在dos視窗會看到不停的輸出name=小強,i=值,這樣的語句。為什麼會這樣呢?
原因是:jvm啟動後,必然有一個執行路徑(線程)從main方法開始的,一直執行到main方法結束,這個線程在java中稱之為主線程。當程式的主線程執行時,如果遇到了迴圈而導致程式在指定位置停留時間過長,則無法馬上執行下面的程式,需要等待迴圈結束後能夠執行。
那麼,能否實現一個主線程負責執行其中一個迴圈,再由另一個線程負責其他代碼的執行,最終實現多部分代碼同時執行的效果?
能夠實現同時執行,通過Java中的多線程技術來解決該問題。
1.4
Thread類
該如何建立線程呢?通過API中搜尋,查到Thread類。通過閱讀Thread類中的描述。Thread是程式中的執行線程。Java 虛擬機器允許應用程式並發地運行多個執行線程。
建立新執行線程有兩種方法。
l 一種方法是將類聲明為 Thread 的子類。該子類應重寫 Thread 類的 run 方法。建立對象,開啟線程。run方法相當於其他線程的main方法。
l 另一種方法是聲明一個實現 Runnable 介面的類。該類然後實現 run 方法。然後建立Runnable的子類對象,傳入到某個線程的構造方法中,開啟線程。
1.5
建立線程方式一 繼承Thread類
建立線程的步驟:
1 定義一個類繼承Thread。
2 重寫run方法。
3 建立子類對象,就是建立線程對象。
4 調用start方法,開啟線程並讓線程執行,同時還會告訴jvm去調用run方法
java基礎——線程