多線程程式擴充了多任務操作的概念,它將多任務操作降低一級來運行,那就是各個程式似乎是在同一個時間內執行了多個任務。每個任務通常稱為一個線程,它是控制項的線程的簡稱。
可以將每個線程是為是在一個不同的環境中啟動並執行,也就是說這些環境看上去好像是每個線程都有自己的cpu一樣,該cpu配有寄存器、記憶體和他自己的代碼。
java建立線程的方法:
1、繼承Thread類
public class MyThread extends Thread<br />{<br /> public run()<br /> {<br /> while(running)<br /> {<br /> code......<br /> sleep(1000);<br /> }<br /> }</p><p> public static void main(String[] args)<br /> {<br /> Thread t = new MyThread();<br /> code......<br /> }<br />}
應用這種形式建立線程對象時不用給出任何參數。繼承Thread類最重要的是要重寫run()方法,稱為線程體,它是整個線程的核心,線程所要完成的任務都要定義線上程體中,實際上不同功能的線程之間的區別就在於線程體的不同。
2、實現Runnable介面
public class MyThread implements Runnable<br />{<br /> public static void main(String[] args)<br /> {<br /> Runnable r = new MyThread();<br /> Thread t = new Thread(r);<br /> t.start();<br /> }</p><p> public void run()<br /> {<br /> for(int i=0; i<10; i++)<br /> {<br /> Thread.sleep(2000);<br /> System.out.println();<br /> }<br /> }<br />}
這種方法主要就是繼承Runnable介面,並且去實現run()方法,在建立線程的時候,需要先聲明一個介面,然後傳給線程類中,這樣子來建立。
這兩種建立方式的比較:
1、java是單繼承的,如果繼承了Thread,就不可以繼承其他的類,因此會使用繼承介面的方式
線程的調度:
1、New Thread狀態
線程已經被建立、執行個體化完畢,但還未啟動,此時線程體(run()方法)未被執行;當線程已經啟動時,線程調度器可為其分配cpu空間
2、Runnable狀態
處於可運行但尚未得到cpu時間的狀態,調用了start()方法之後,為該線程完成登記工作和分配資源工作,此時該線程處於Runnable狀態。
3、Running狀態
線程調度器為其分配了cpu時間,處於運行狀態,該狀態可與其他狀態進行轉換。
4、Wait/Block狀態
等待某個時間發生,一旦發生之後就離開該狀態,進入Runnable狀態。通常在調用sleep或wait方法時進入該狀態,I/O阻塞時也可能進入該狀態,或者發生在多線程同步訪問時。
5、Dead狀態
run方法執行完畢後,線程就處於Dead狀態了,非預期的異常也會導致run方法的終止。死亡的線程不可重新啟動,此時的線程對象與普通對象沒有區別。
6、離開阻塞狀態
如果一個線程進入了sleep狀態,那麼直到所規定的毫秒數結束,才能離開該狀態,進入Runnable狀態;
如果I/O阻塞,則等操作完成後才能離開該狀態;
當一個線程調用了wait方法,那麼只能有另一個線程調用notify或者notifyAll方法才能離開該狀態;
如果因為多線程同步引起阻塞,則需要得到對象鎖時才能離開該狀態。
線程的啟動:
t.start();
結束線程:
1、自然消亡:run方法結束
2、強制死亡:stop方法
線程互動:
為了讓線程對一個對象調用wait()或者notify(),線程必須鎖定那個特定的對象,這時候就需要使用同步機制加以保護。也就是說,只能在它們被調用的執行個體的同步塊內使用wait()和notify()。在調用這些方法時,必須保證持有該對象的鎖定標誌。
synchronized(Stack)<br />{<br /> if(Stack.isEmpty())<br /> {<br /> Stack.wait();<br /> }<br />}<br />
掛起線程:
sleep():此方法是一個使線程暫時停止執行一段時間的方法。在sleep時間間隔期滿後,線程通常不是立即恢複執行。因為此時,其他線程可能正在運行而且沒有被調度為放棄執行,除非有以下幾種情況發生:
1、這個被喚醒的線程具有更高的優先順序
2、正在啟動並執行線程因為其他原因而阻塞