問題: windows號稱是多任務的操作系統,那麼windows是同時運行多個應用程序嗎?
從宏觀的角度: windows確實是在同時運行多個應用程序。
從微觀角度: cpu是做了一個快速切換執行的動作,由於速度態度,所以我感覺不到在切換 而已。
線程: 線程在一個進程 中負責了代碼的執行,就是進程中一個執行路徑,
多線程: 在一個進程中有多個線程同時在執行不同的任務。
疑問 :線程負責了代碼 的執行,我們之前沒有學過線程,爲什麼代碼可以執行呢?
運行任何一個java程序,jvm在運行的時候都會創建一個main線程執行main方法中所有代碼。
一個java應用程序至少有幾個線程?
至少有兩個線程, 一個是主線程負責main方法代碼的執行,一個是垃圾回收器線程,負責了回收垃圾。
多線程的好處:
1. 解決了一個進程能同時執行多個任務的問題。
2. 提高了資源的利用率。
多線程 的弊端:
1. 增加cpu的負擔。
2. 降低了一個進程中線程的執行概率。
3. 引發了線程安全 問題。
4. 出現了死鎖現象。
如何創建多線程:
創建線程的方式:
方式一:
1. 自定義一個類繼承Thread類。
2. 重寫Thread類的run方法 , 把自定義線程的任務代碼寫在run方法中
疑問: 重寫run方法的目的是什麼?
每個線程都有自己的任務代碼,jvm創建的主線程的任務代碼就是main方法中的所有代碼, 自定義線程的任務代碼就寫在run方法中,自定義線程負責了run方法中代碼。
3. 創建Thread的子類對象,並且調用start方法開啓線程。
注意: 一個線程一旦開啓,那麼線程就會執行run方法中的代碼,run方法千萬不能直接調用,直接調用run方法就相當調用了一個普通的方法而已
並沒有開啓新的線程。
public class Demo1 extends Thread {
@Override //把自定義線程的任務代碼寫在run方法中。
public void run() {
for(int i = 0 ; i < 10 ; i++){
System.out.println("自定義線程:"+i);
}
}
public static void main(String[] args) {
//創建了自定義的線程對象。
Demo1 d = new Demo1();
//調用start方法啓動線程
d.start();
for(int i = 0 ; i < 10 ; i++){
System.out.println("main線程:"+i);
}
}
}
運行結果:
main線程:0
main線程:1
main線程:2
main線程:3
main線程:4
main線程:5
自定義線程:0
自定義線程:1
自定義線程:2
main線程:6
自定義線程:3
自定義線程:4
自定義線程:5
自定義線程:6
自定義線程:7
main線程:7
main線程:8
main線程:9
自定義線程:8
自定義線程:9
看運行結果是不是有種資源搶奪的意思? 這就是多線程的基本原理了