執行緒與第一個執行緒程式
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():中斷執行緒。
建立執行緒的步驟:
- 建立一個Thread類的子類。
- 覆蓋Thread類的run()方法。
- 建立所定義的子類的一個物件。
- 呼叫該物件的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();
}
}
}
}
執行截圖:
說明:也一樣,每次執行可能會產生不同的結果,因為程式碼沒有準確的控制什麼時候執行哪個執行緒。