java複習第6天---多線程----6.2--多線程和多線程實現
目錄
文章目錄
內容
1、多線程
1.1、進程和線程
-
什麼是進程,什麼是線程?
進程:是併發執行的程序在執行過程中分配和管理資源的基本單位,是一個動態概念,競爭計算機系統資源的基本單位。 -
線程:是進程的一個執行單元,是進程內科調度實體。比進程更小的獨立運行的基本單位。線程也被稱爲輕量級進程。
一個程序至少一個進程,一個進程至少一個線程。
-
進程線程的區別
- 地址空間:同一進程的線程共享本進程的地址空間,而進程之間則是獨立的地址空間。
- 資源擁有:同一進程內的線程共享本進程的資源,但是進程之間的資源是獨立的。
- 一個進程崩潰後,在保護模式下不會對其他進程產生影響,但是一個線程崩潰整個進程都死掉。所以多進程要比多線程健壯。
- 進程切換時,消耗的資源大,效率高。所以涉及到頻繁的切換時,使用線程要好於進程。同樣如果要求同時進行並且又要共享某些變量的併發操作,只能用線程不能用進程。
- 執行過程:每個獨立的進程程有一個程序運行的入口、順序執行序列和程序入口。但是線程不能獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。
- 線程是處理器調度的基本單位,但是進程不是。
- 兩者均可併發執行。
-
優缺點:
1.線程執行開銷小,但是不利於資源的管理和保護。線程適合在SMP機器(雙CPU系統)上運行。
2.進程執行開銷大,但是能夠很好的進行資源管理和保護。進程可以跨機器前移。
參考地址:https://blog.csdn.net/QQ1608731824/article/details/81461269
1.2、線程調度
目前沒有深入理解,可自行搜索或者參考博文:
https://blog.csdn.net/sdp1103285470/article/details/93602329
https://www.iteye.com/blog/youyu4-2351235
2、線程創建方式
上圖2-1:
2.1、線程創建方式1
-
格式
修飾符 class 類名 extends Thread { @override public void run() { ... } } new 類名().start(); // 啓動線程
-
示例2.1-1:
package thread.create; public class MyThread extends Thread{ @Override public void run() { for(int i = 0; i < 10; i++) { System.out.println("MyThread:" + i); } } } package thread.create; public class TestThread1 { public static void main(String[] args) { Thread th = new MyThread(); th.start(); for(int i =0; i < 10; i++) { System.out.println("main:" + i); } } } 測試結果: main:0 MyThread:0 main:1 MyThread:1 main:2 MyThread:2 main:3 MyThread:3 MyThread:4 main:4 MyThread:5 main:5 MyThread:6 MyThread:7 MyThread:8 main:6 main:7 main:8 main:9 MyThread:9
2.2、Thread常用方法
實現多線程,需要繼承Thread類。
- 構造方法:
修飾符 | 返回值類型 | 方法名 | 參數 | 描述 |
---|---|---|---|---|
public | Thread | 創建新的線程對象 | ||
public | Thread | String name | 創建指定名稱的線程對象 | |
public | Thread | Runnable target | 分配指定目標的線程對象 | |
public | Thread | Runnable target, String name | 分配指定目標,指定名稱的線程對象 |
- 常用方法:
修飾符 | 返回值類型 | 方法名 | 參數 | 描述 |
---|---|---|---|---|
public | String | getName | 獲取線程名稱 | |
public | void | start | 線程開始執行;JVM自動調用run方法 | |
public | void | run | 線程要執行的任務此處定義 | |
public | void | sleep | long millis | 線程休眠指定時間 |
public static | Thread | currentThread | 返回當前正在執行線程對象的引用 |
2.3、線程創建方式2
第二種方式爲實現Runnable接口。步驟如下:
- 創建Runnable接口的實現類
- 在實現類中重寫run方法,設置線程任務
- 創建Runnable接口實現類的對象
- 創建Thread的對象,構造中傳遞Runnable接口實現類的對象
- 調用Thread對象start方法,開啓線程
-
示例2.3-1:
package thread.create; public class MyRunnableThread implements Runnable{ @Override public void run() { for(int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName()+ ":" + i); } } } package thread.create; public class TestMyRunableThread { public static void main(String[] args) { Thread th = new Thread(new MyRunnableThread()); th.start(); for(int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName() + ":" + i); } } } 測試結果: main:0 Thread-0:0 main:1 Thread-0:1 main:2 Thread-0:2 main:3 main:4 main:5 main:6 main:7 main:8 main:9 Thread-0:3 Thread-0:4 Thread-0:5 Thread-0:6 Thread-0:7 Thread-0:8 Thread-0:9
2.4、匿名內部類的方式創建線程
package thread.create;
public class TestThread2 {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
for(int i = 0; i < 10; i++) {
System.out.println("MyThread:" + i);
}
}
}).start();
for(int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
}
測試結果:
main:0
MyThread:0
main:1
MyThread:1
main:2
MyThread:2
main:3
MyThread:3
MyThread:4
MyThread:5
MyThread:6
MyThread:7
MyThread:8
MyThread:9
main:4
main:5
main:6
main:7
main:8
main:9
2.5、Runnable與Thread 創建線程比較
用Runnable實現多線程比用Thread實現多線程具有的優勢:
- 適合多個相同程序代碼的線程共享同一個資源
- 可以避免java中單繼承的侷限性
- 增加程序的健壯性,實現解耦操作,代碼可以被多個線程共享,代碼和線程獨立
- 線程池只能放入實現Runnable或Callable類的線程,不能直接放入繼承Thread類
後記 :
本項目爲參考某馬視頻開發,相關視頻及配套資料可自行度娘或者聯繫本人。上面爲自己編寫的開發文檔,持續更新。歡迎交流,本人QQ:806797785
前端項目源代碼地址:https://gitee.com/gaogzhen/vue-leyou
後端JAVA源代碼地址:https://gitee.com/gaogzhen/JAVA