1. 程式人生 > >程序與執行緒,執行緒的兩種建立方式

程序與執行緒,執行緒的兩種建立方式

程式:一條一條的按照語法規則排列起來的指令序列,告訴計算機完成一連串的操作,程式預設的是儲存在硬碟上的;

當程式開始執行的時候,OS(作業系統)要把程式裝入記憶體,然後CPU從記憶體中一條一條的讀取並執行指令;

當一個程式被裝入記憶體,正在執行的時候,這時這個程式就被稱為一個程序(正在進行的程式);


OS(作業系統)是如何做到多程序同時執行的呢?


作業系統把時間單位平均分成若干小份,每一個小份稱為一個時間片,作業系統在不同時間片裡去執行不同程序的指令,如上圖在時間片中執行A程序或B程序;

作業系統是如何做到多執行緒同時執行的呢?也是通過時間片的形式,把程序的時間片分為更小的時間片。

在一個程序中同時執行的多個操作稱為執行緒。

程序和執行緒的區別:

1 . 每個程序都有各自獨立的記憶體空間,而執行緒沒有獨立的記憶體空間;

2 . 執行緒必須要執行在程序之內,換句話說沒有程序,就不會有執行緒;

3 . 執行緒可以共享程序的記憶體空間;

執行緒是程式中的執行程式。Java虛擬機器允許應用程式併發地執行多個執行執行緒。

建立新執行行程有兩種方法。一種方法是將類宣告為 Thread 的子類。該子類應重寫 Thread 類的 run 方法。接下來可以分配並啟動該子類的例項。

任意一個專案

main方法:

public class Main {
	public static void main(String[] args) {
		// 我們這段程式中包含了三個執行緒,第一個是主執行緒.主執行緒是JVM啟動的時候建立的
		// 並且在主執行緒中呼叫類main方法.程式執行的時候,主執行緒處於正在執行狀態.這樣的話才能執行main方法
		// 建立執行緒物件
		Thread1 t1 = new Thread1("小黑執行緒");
		Thread2 t2 = new Thread2("小紅執行緒");
		// 啟動執行緒的時候要呼叫執行緒的start()方法.執行緒啟動之後,會自動的執行執行緒體
		// 這樣的話,兩個執行緒會交替執行
		t1.start();
		t2.start();
		// 而不能直接呼叫執行緒的run()方法.這樣兩個執行緒會失去併發性.一個執行完另一個再執行
		// t1.run();
		// t2.run();
		// 我們也可以讓主執行緒執行某些操作
		// 主執行緒和我們自己建立的執行緒一樣,也就是一個執行緒而已.只不過這個執行緒是JVM啟動的時候由JVM建立的
		for (int i = 1; i <= 500000; i++) {
			System.err.println("主執行緒在計數:i=======" + i);
		}
	}
}

執行緒1:

public class Thread1 extends Thread {
	public Thread1(String name) {
		super(name);
	}
	// 我們把執行緒要執行的操作寫在run方法中
	// run()方法又被稱為執行緒體
	public void run() {
		for (int i = 1; i <= 500000; i++) {
			System.out.println(this.getName() + "在計數:i=" + i);
		}
	}
}

執行緒2:

public class Thread2 extends Thread {
	public Thread2(String name){
		super(name);
	}
	// 我們把執行緒要執行的操作寫在run方法中
	// run()方法又被稱為執行緒體
	public void run() {
		for (int i = 1; i <= 500000; i++) {
			System.err.println( this.getName() +"在計數:i=" + i);
		}
	}
}

建立執行緒的另一種方法是聲名實現 Runnable 介面的類。該類然後實現 run 方法。然後可以分配該類的例項,在建立 Thread 時作為一個引數來傳遞並啟動。

任意一個專案

main方法:

public class Main {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// 建立兩個目標物件
		Runnable tar1 = new Target1();
		Runnable tar2 = new Target2();
		// 建立執行緒物件,並讓執行緒物件來執行指定的目標物件
		Thread t1 = new Thread(tar1, "小黑執行緒"); // t1執行緒來執行目標1,t1執行緒的名字叫 小黑執行緒
		Thread t2 = new Thread(tar2, "小紅執行緒");
		// 啟動執行緒.執行緒啟動之後會自動的執行目標物件
		t1.start();
		t2.start();
	}
}
執行緒1:
// 我們把實現Runnable介面的類稱為目標物件,也就是專門用來給執行緒執行的
public class Target1 implements Runnable {
	@Override
	public void run() {
		for (int i = 1; i <= 500000; i++) {
			// 目標物件是專門來給執行緒物件執行的
			// 我們需要在目標中獲取正在執行該目標的執行緒物件: Thread.currentThread();
			System.out.println(Thread.currentThread().getName() + "正在工作, 小黑目標在計數:i=" + i);
		}
	}
}
執行緒2:
public class Target2 implements Runnable {
	@Override
	public void run() {
		for (int i = 1; i <= 500000; i++) {
			System.err.println(Thread.currentThread().getName() + "正在工作,小紅目標在計數:i=" + i);
		}
	}
}

希望對你有幫助,祝你有一個好心情,加油!

若有錯誤、不全、可優化的點,歡迎糾正與補充;轉載請註明出處!