天天看點

java複習第6天---多線程----6.2--多線程和多線程實作1、多線程2、線程建立方式

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. 位址空間:同一程序的線程共享本程序的位址空間,而程序之間則是獨立的位址空間。
    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:

java複習第6天---多線程----6.2--多線程和多線程實作1、多線程2、線程建立方式

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