Java線程初識

1. 進程是什麼

windows電腦中,打開任務管理器,可以看到電腦中執行的每一個程序,每一個程序就是一個進程。

Windows系統是一個多任務系統。
電腦可以同時執行多個程序。

CPU時間片概念CPU時間片概念

2. 線程是什麼

電腦管家是一個軟件,也是程序 ==> 進程
電腦可以同時開啓 病毒查殺,垃圾清理,一鍵加速…等功能

每一個功能就可以看做是線程!

一個應用程序 ==> 進程
應用程序的某一個功能 ==> 線程
應用程序中可以同時執行多個功能 ==> 多線程

線程使用的是系統資源,該系統資源你是操作系統分配給當前進程使用的。
多個線程的情況下,同時【搶佔執行】會導致資源緊缺。
線程搶佔過程就類似於進程搶佔過程。

一個Java程序,最少有幾個線程?
2個線程
 main線程
 JVM的GC機制,守護線程。

3. 併發和並行

併發:
兩個或者兩個以上的事務在同一個時間段發生

並行:
兩個或者兩個以上的事務在同一個時刻發生
宏觀並行,微觀串行

高併發
雙十一
JD 618
12306
中午下課的餐廳
同時在一個時間段以內,很多事情都發生了,這就是高併發。

併發與並行

4. 多線程

4.1 多線程的優缺點

優點
1. 提升資源利用率
2. 提高用戶體驗

缺點:
1. 降低了其他線程的執行概率
2. 用戶會感受到軟件的卡頓問題
3. 增加的系統,資源壓力
4. 多線程情況下的共享資源問題,線程衝突,線程安全問題

4.2 創建自定義線程類的兩種方式

class Thread類
Java中的一個線程類
Thread類是Runnable接口的實現類,同時提供了很多線程的操作使用的方法。

interface Runnable接口
這裏規定了what will be run?
裏面只有一個方法 run方法

方式一:
自定義線程類,繼承Thread類,重寫run方法
創建自定義線程對象,直接調用start方法,開啓線程

方式二:
自定義線程類,遵從Runnable接口
使用自定義遵從接口Runnable實現類對象,作爲Thread構造方法參數
藉助於Thread類對象和start方法,開啓線程

【推薦】
以上兩種方式,推薦使用方法二,遵從Runnable接口來完成自定義線程,不影響正常的繼承邏輯,並且可以使用匿名內部類來完成線程代碼塊的書寫。
代碼如下:

/*
 * 自定義線程類MyThread1繼承Thread類
 */
class MyThread1 extends Thread {
	@Override
	public void run() {
		for (int i = 0; i < 100; i++) {
			System.out.println("繼承Thread類自定義線程類");
		}
	}
}

/*
 * 自定義線程類MyThread2遵從Runnable接口
 */
class MyThread2 implements Runnable {

	@Override
	public void run() {
		for (int i = 0; i < 100; i++) {
			System.out.println("遵從Runnable接口實現自定義線程類");
		}
	}
}

public class Demo1 {
	public static void main(String[] args) {
		new Thread(new Runnable() {

			@Override
			public void run() {
				for (int i = 0; i < 100; i++) {
					System.out.println("匿名內部類方式創建對象,作爲線程執行代碼");
				}
			}
		}).start();
		// 創建一個繼承Thread類自定義線程類對象
		MyThread1 myThread1 = new MyThread1();
		// 這裏不是啓動線程,而且將run方法做出一個普通方法執行。
		// myThread1.run();
		myThread1.start();
		
		// 創建一個Thread類對象,使用遵從Runnable接口的實現類作爲構造方法參數
		Thread thread = new Thread(new MyThread2());
		// 藉助於Thread類內的start方法開啓線程
		thread.start();

		for (int i = 0; i < 100; i++) {
			System.out.println("main線程");
		}
	}
}
4.3 自定義線程執行流程簡述

在這裏插入圖片描述

4.4 Thread類需要了解的方法

構造方法 Constructor
Thread();
分配一個新的線程對象,無目標,無指定名字
Thread(Runnable target);
創建一個新的線程對象,並且在創建線程對象的過程中,使用Runnable接口的實現類
對象作爲執行的線程代碼塊目標
Thread(String name);
創建一個新的線程,無指定目標,但是指定當前線程的名字是什麼
Thread(Runnable target, String name);
創建一個線程的線程對象,使用Runnable接口實現類對象,作爲執行目標,並且指定name作爲線程名

成員方法:
void setName(String name);
String getName();
以上兩個是name屬性setter和getter方法
void setPriority(int Priority);
設置線程的優先級,非一定執行要求,只是增加執行的概率
優先級數值範圍 [1 - 10] 10最高 1最低 5默認
int getPriority();
獲取線程優先級
void start();
啓動線程對象

public static void sleep(int ms);
當前方法是靜態方法,通過Thread類調用,要求是當前所在線程代碼塊對應的線程,
進行休眠操作,休眠指定的毫秒數
public static Thread currentThread();
當前方法是靜態方法,通過Thread類調用,獲取當前所處代碼塊對應的線程對象。

這些方法必須牢牢記住!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章