首先我們需要知道什麼是線程:是程序執行流的最小單元,包括就緒、阻塞和運行三種基本狀態。
舉個簡單的例子:我們把生活中的兩件事吃飯和寫作業當作是兩個線程,當你正在寫作業的時候,爸媽叫你吃飯,你就直接去了,等吃完飯回來後再接著寫作業。這就是相當於兩個線程其中一個從運行狀態轉入就緒狀態,另一個線程從就緒狀態轉入運行狀態。
創建線程包括繼承Thread類和實現Runnable接口兩種方式(JDK5.0以後還包括了實現Callable等方式來實現線程,這裡不做介紹,感興趣的小伙伴可以自己查資料),下面介紹第一種創建線程的方式(通過繼承Thread類):
1 package com.test.thread; 2 3 public class EasyThread extends Thread { 4 private String name; 5 public EasyThread(String name) { 6 this.name=name; 7 } 8 //重寫父類Thread中的run方法 9 @Override 10 public void run() { 11 for (int i = 0; i <2; i++) { 12 System.out.println(name+"運行"+i); 13 try { 14 //隨機設置休眠時間 15 sleep((int)Math.random()*10); 16 } catch (InterruptedException e) { 17 e.printStackTrace(); 18 } 19 } 20 }; 21 22 public static void main(String[] args) { 23 //創建一個線程 24 EasyThread thread1=new EasyThread("線程1"); 25 //啟動線程(啟動線程後會執行上面的run方法) 26 thread1.start(); 27 EasyThread thread2=new EasyThread("線程2"); 28 thread2.start(); 29 } 30 31 }
多次運行上述代碼,查看運行結果,你會發現可能每次的輸出結果可能與上次相同也可能不同。因為休眠時間不同,導致運行的結果不盡相同,可以好好體會一下。下面講述第二種創建線程的方式(實現Runnable接口):
1 package com.test.thread; 2 3 public class ImpRunnable implements Runnable { 4 private String name; 5 6 public ImpRunnable(String name) { 7 this.name = name; 8 } 9 10 // 實現接口Runnable中的run方法 11 @Override 12 public void run() { 13 for (int i = 0; i < 2; i++) { 14 System.out.println(name + "運行" + i); 15 try { 16 // 隨機設置休眠時間 17 Thread.sleep((int) Math.random() * 10); 18 } catch (InterruptedException e) { 19 e.printStackTrace(); 20 } 21 } 22 }; 23 24 public static void main(String[] args) { 25 // 創建線程並啟動(與第一種方法略有不同) 26 new Thread(new ImpRunnable("線程1")).start(); 27 new Thread(new ImpRunnable("線程2")).start(); 28 } 29 }
以上即為實現線程的兩種常用的方式,在使用多線程(多個人共同完成同一個任務)的時候我們一般用實現Runnable接口的方式,關於兩者之間具體的區別感興趣的小伙伴可以自行查閱資料