java複習第6天---多線程----6.2--多線程和多線程實現

java複習第6天---多線程----6.2--多線程和多線程實現


目錄




內容

1、多線程

1.1、進程和線程

  • 什麼是進程,什麼是線程?
    進程:是併發執行的程序在執行過程中分配和管理資源的基本單位,是一個動態概念,競爭計算機系統資源的基本單位。

  • 線程:是進程的一個執行單元,是進程內科調度實體。比進程更小的獨立運行的基本單位。線程也被稱爲輕量級進程。

一個程序至少一個進程,一個進程至少一個線程。

  • 進程線程的區別

    1. 地址空間:同一進程的線程共享本進程的地址空間,而進程之間則是獨立的地址空間。
    2. 資源擁有:同一進程內的線程共享本進程的資源,但是進程之間的資源是獨立的。
    3. 一個進程崩潰後,在保護模式下不會對其他進程產生影響,但是一個線程崩潰整個進程都死掉。所以多進程要比多線程健壯。
    4. 進程切換時,消耗的資源大,效率高。所以涉及到頻繁的切換時,使用線程要好於進程。同樣如果要求同時進行並且又要共享某些變量的併發操作,只能用線程不能用進程。
    5. 執行過程:每個獨立的進程程有一個程序運行的入口、順序執行序列和程序入口。但是線程不能獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。
    6. 線程是處理器調度的基本單位,但是進程不是。
    7. 兩者均可併發執行。
  • 優缺點:
    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接口。步驟如下:

  1. 創建Runnable接口的實現類
  2. 在實現類中重寫run方法,設置線程任務
  3. 創建Runnable接口實現類的對象
  4. 創建Thread的對象,構造中傳遞Runnable接口實現類的對象
  5. 調用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實現多線程具有的優勢:

  1. 適合多個相同程序代碼的線程共享同一個資源
  2. 可以避免java中單繼承的侷限性
  3. 增加程序的健壯性,實現解耦操作,代碼可以被多個線程共享,代碼和線程獨立
  4. 線程池只能放入實現Runnable或Callable類的線程,不能直接放入繼承Thread類

後記

本項目爲參考某馬視頻開發,相關視頻及配套資料可自行度娘或者聯繫本人。上面爲自己編寫的開發文檔,持續更新。歡迎交流,本人QQ:806797785

前端項目源代碼地址:https://gitee.com/gaogzhen/vue-leyou
後端JAVA源代碼地址:https://gitee.com/gaogzhen/JAVA
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章