首先我們需要知道什麼是線程:是程序執行流的最小單元,包括就緒、阻塞和運行三種基本狀態。
舉個簡單的例子:我們把生活中的兩件事吃飯和寫作業當作是兩個線程,當你正在寫作業的時候,爸媽叫你吃飯,你就直接去了,等吃完飯回來後再接著寫作業。這就是相當於兩個線程其中一個從運行狀態轉入就緒狀態,另一個線程從就緒狀態轉入運行狀態。
創建線程包括繼承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接口的方式,關於兩者之間具體的區別感興趣的小伙伴可以自行查閱資料