java複習第6天---多線程----6.2--多線程和多線程實作
目錄
文章目錄
- 1、多線程
-
- 1.1、程序和線程
- 1.2、線程排程
- 2、線程建立方式
-
- 2.1、線程建立方式1
- 2.2、Thread常用方法
- 2.3、線程建立方式2
- 2.4、匿名内部類的方式建立線程
- 2.5、Runnable與Thread 建立線程比較
- ***後記*** :
内容
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:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2csUnVHFmNkJjYoRmMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLxMTM3MzMxIjM2ITNwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
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