一.線程的概念:
線程(thread),又叫輕量級的進程(Lightweight Process, LWP),它包括線程ID,當前指令指針,寄存器集合和堆棧.
在java中可以把一個程序轉換成多個獨立的子任務,每個子任務可以比喻爲一個線程.強大的操作系統會有自動分割CPU的制度.爲每個線程做調度.注意(一般考慮)在單CPU模式下,同個時間點只能運行一個線程,只不過由於CPU的高速切換,在一個時間段可以不斷跳轉多個線程,所以用戶感覺像是多個線程同時進行,其實這稱之爲進程的併發.
在單個程序中同時運行多個線程完成不同任務叫做多線程.
進程的狀態:
(此圖出自馬士兵尚學堂視頻教程)
二.線程的狀態:
在java中我們可以大概分爲:新建(New),就緒(Runnable),運行(Running),死亡(Dead),阻塞(Blocked)五個狀態
- 新建 : 線程對象創建成功,還爲調用start()方法,則未獲取系統資源
- 就緒 : 已經調用了start()方法,該狀態可以和運行狀態相互切換,任何狀態的線程要運行必須先處於就緒狀態.
- 運行 : 此刻線程已經被CPU分配時間.
- 阻塞 : "當線程調用了自身的sleep()方法或其他線程的join()方法,就會進入阻塞狀態(該狀態既停止當前線程,但並不釋放所佔有的資源)。當sleep()結束或join()結束後,該線程進入可運行(就緒)狀態,繼續等待OS分配時間片"-------此引用來源(http://bbs.csdn.net/topics/350226555)
- 死亡 : 線程被JVM線程調度收回,再也不會被重新調度執行
Java中有兩種方法創建新線程
1.實現Runnable接口,重寫其中的Run函數,其中用到了多態
public class Thread_test {
public static void main(String[] args) throws InterruptedException
{
//方法1
Run r = new Run(); //創建重寫Runnable 接口的Run對象r
Thread t1 = new Thread(r); //通過Thread 構造函數傳進去r對象 實例化一個對象t1
t1.start(); //通過t1調用start()方法
//方法2
/*Run2 r2 = new Run2();
r2.start();*/
for(int i=0;i<20;i++)
{
System.out.println("MainThread:"+i+" is running.");
Thread.sleep(100); //在哪個線程裏調用就讓哪個線程睡眠(此處睡眠主線程)
}
}
}
class Run implements Runnable { //Run實現了Runnable接口的run方法 用到了多態(推薦使用)
public void run() {
for(int i=0;i<20;i++)
{
System.out.println("LittleThread:"+i+" is running.");
try {
Thread.sleep(100); //在哪個線程裏調用就讓哪個線程睡眠(此處睡眠little線程)
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
執行結果 : 實現main()方法中的主線程和新進程併發執行,由於在一個CPU時間片裏就執行完畢,我給每個線程加了個sleep();[注意拋出睡眠中斷異常] , 方便觀察其併發執行的狀態.
2.第二種方法是直接繼承JAVA中的Thread類:
public class Thread_test {
public static void main(String[] args) throws InterruptedException
{
//方法2
Run2 r2 = new Run2();
r2.start();<span style="white-space:pre"> </span>//由於Run2直接繼承Thread 所以可以直接調用start();
for(int i=0;i<20;i++)
{
System.out.println("MainThread:"+i+" is running.");
Thread.sleep(100); //在哪個線程裏調用就讓哪個線程睡眠(此處睡眠主線程)
}
}
}
class Run2 extends Thread{ //直接建立一個繼承了Thread的方法,可直接用對像start新線程 方法2
public void run() {
for(int i=0;i<20;i++)
{
System.out.println("LittleThread:"+i+" is running.");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
運行結果:同上.
運行IDE: Eclipse_Mars
OS:Win7
參考資料:Java程序設計高級教程(趙卓君主編)、馬士兵尚學堂視頻教程