1. 程式人生 > >執行緒與第一個執行緒程式

執行緒與第一個執行緒程式

1.執行緒的相關概念

首先得知道什麼是程序什麼是執行緒?

我的理解是程序是指在系統中正在執行的一個應用程式;程式一旦執行就是程序,或者更專業化來說:程序是指程式執行時的一個例項。

執行緒是程序的一個實體。

程序——資源分配的最小單位,執行緒——程式執行的最小單位。

執行緒與程序的區別:

1. 一個程式至少有一個程序,一個程序至少有一個執行緒

2. 執行緒的劃分尺度小於程序,使得多執行緒程式的併發性高

3. 程序在執行過程中擁有獨立的記憶體單元,而多個執行緒共享記憶體,從而極大地提高了程式的執行效率

4. 每個獨立的執行緒有一個程式執行的入口、順序執行序列和程式的出口。但是執行緒不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制

5. 多執行緒的意義在於一個應用程式中,有多個執行部分可以同時執行。但作業系統並沒有將多個執行緒看作多個獨立的應用,來實現程序的排程和管理以及資源分配

2.執行緒建立的兩種方法

在Java可以使用兩種方法建立執行緒。第一種方式是通過建立Thread類構造子類,建立子類物件生成執行緒,另一種是構造一個實現Runnable介面的類,建立該類物件,用該類物件作為引數建立Thread物件生成執行緒。

2.1 Thread類

構造方法·:

public Thread(ThreadGroup group,Runnable target,String name);

group:指明該執行緒所屬的執行緒組。

target:實際執行執行緒體的物件。

name:執行緒名字。

格式中的各項引數都可以為空。

常用方法:

(1)start():啟動執行緒。

(2)run():執行緒體。

(3)sleep(int millsecond): 使執行緒睡眠millsecond毫秒。

(4)currentThread():獲取當前執行緒。

(5)interrupt():中斷執行緒。

建立執行緒的步驟:

  1. 建立一個Thread類的子類。
  2. 覆蓋Thread類的run()方法。
  3. 建立所定義的子類的一個物件。
  4. 呼叫該物件的start()方法啟用執行緒。

例項:使用Thread的子類建立執行緒。

package project;
public class ThreadCreate1 {
	public static void main(String args[]){
	//建立一個Thread類陣列
	Thread th[]=new Thread[3];
	//使用子類例項化陣列
	th[0]=new AnimalThread("執行緒1");
	th[1]=new AnimalThread("執行緒2");
	th[2]=new AnimalThread("執行緒3");
	th[0].start();
	th[1].start();
	th[2].start();
	}
}
//建立一個Thread類的子類
class AnimalThread extends Thread{
	//構造方法指定執行緒名字
	public AnimalThread(String name){
		super(name);//呼叫父類構造方法
	}
	//重寫run()方法
	public void run(){
		for(int i=1;i<4;i++){
			//getName()方法返回執行緒名字
			System.out.println(getName()+"的第"+i+"次輸出");
			try{
				//使執行緒睡眠50毫秒
				sleep(50);
			}catch(InterruptedException e){
				e.printStackTrace();
			}
		}
		System.out.println(getName()+"結束!");
	}
}

執行截圖:

說明:每次執行可能會產生不同的結果,因為程式碼沒有準確的控制什麼時候執行哪個執行緒。

2.2 Runnable 介面

1.Runnable介面的定義格式

java.lang中Runnable介面的定義如下:

public interface Runnable(){

 void run();

}

2. Runbable 介面建立執行緒的步驟

(1)定義一個實現Runnable介面的類·。

(2)實現介面中的的run()方法。

(3)建立所定義的子類的一個物件。

(4)呼叫該物件的start()方法啟用執行緒。

例項:實現Runnable介面 建立執行緒。

package project;

public class ThreadCreate2 {

	public static void main(String[] args) {
		//建立一個Thread類陣列
		Thread th[]=new Thread[3];
		//使用子類例項化陣列
		th[0]=new AnimalThread("執行緒1");
		th[1]=new AnimalThread("執行緒2");
		th[2]=new AnimalThread("執行緒3");
		th[0].start();
		th[1].start();
		th[2].start();

	}

}
class ThreadRunnable implements Runnable{
	public void run(){
		for(int i=1;i<4;i++){
			//getName()方法返回執行緒名字
			System.out.println(Thread.currentThread().getName()+"的第"+i+"次輸出");
			try{
				//使執行緒睡眠50毫秒
				Thread.currentThread();
				Thread.sleep(50);
			}catch(InterruptedException e){
				e.printStackTrace();
			}
		}
	}
}

執行截圖:

 說明:也一樣,每次執行可能會產生不同的結果,因為程式碼沒有準確的控制什麼時候執行哪個執行緒。