多線程
運行在操作系統之上的每個應用程序,都會占用一個獨立的進程(process),而進程內又允許運行多個線程(thread),這意味著一個程序可以同時執行多個任務的功能
在Java中實現多線程:Thread類,Runnable接口
在基于線程的多任務而處理環境中,線程是執行特定任務的可執行代碼的最小單位;
多任務
當今的操作系統絕大部分都是基于多任務的操作系統;
多任務操作系統的最大特點,是可以同時運行多個程序;
由于操作系統支持時間片輪換算法,使得用戶感覺多個程序在同時運行,似乎有多個CPU在起作用。
進程與線程的區別
進程是指系統中正在運行中的應用程序,它擁有自己獨立的內存空間;
線程是指進程中一個執行流程,一個進程中允許同時啟動多個線程,他們分別執行不同的任務;
線程與進程的主要區別在于:每個進程都需要操作系統為其分配獨立的內存地址空間,而同一進程中的所有線程在同一塊地址空間中,這些線程可以共享數據,因此線程間的通信比較簡單,消耗的系統開銷也相對較小。
線程狀態
新建狀態(New):使用new關鍵字創建線程對象,僅僅被分配了內存;
就緒狀態(Ready):線程對象被創建后,等待它的start方法被調用,以獲得CPU的使用權;
運行狀態(Running):執行run方法,此時的線程的對象正占用CPU;
睡眠狀態(Sleeping):調用sleep方法,線程被暫停,睡眠時間結束后,線程回到就緒狀態,睡眠狀態的線程不占用CPU;
死亡狀態(Dead):run方法執行完畢后,線程進入死亡狀態;
阻塞狀態(Blocked):線程由于某些事件(如等待鍵盤輸入)放棄CPU,暫停運行,直到線程重新進入就緒狀態,才有機會轉到運行狀態;
相關詞匯說明
|
單 詞 |
說 明 |
|
thread |
線,線程 |
|
runnable |
可追捕的,可獵取的 |
|
current |
當前的,最近的 |
|
sleep |
睡,睡眠 |
|
yield |
屈服,屈從 |
|
interrupted |
中斷的,被阻止的 |
|
daemon |
后臺程序 |
|
wait |
等待,等候 |
|
notify |
通報 |
|
synchronized |
同步的
|
Thread類
主線程示例
public class MainThreadDemo {
public static void main(String[] args) {
//獲得當前運行的線程
Thread tMain = Thread.currentThread();
System.out.println("當前運行的線程是:" + tMain);
try {
for (int i = 0; i < 5; i++) {
System.out.println(i);
Thread.sleep(2000); //使當前線程休眠2秒
}
}
catch (java.lang.InterruptedException ie) {
ie.printStackTrace();
}
}
}
在Java中要實現線程,最簡單的方式就是擴展Thread類,重寫其中的run方法,方法原型如下:
public void run()
如:
public class MyThread extends Thread {
public void run() {
……
}
}
Thread類中的run方法本身并不執行任何操作,如果我們重寫了run方法,當線程啟動時,它將執行run方法。
Runnable接口
java.lang.Runnable接口中僅僅只有一個抽象方法:
public void run();
也可以通過實現Runnable接口的方式來實現線程,只需要實現其中的run方法即可;
Runnable接口的存在主要是為了解決Java中不允許多繼承的問題;
使用Runnable接口可以使語法的自由度更高。