java線程(一),java線程(
java線程基礎什麼是線程?
這裡引用百度百科的一句話:“線程,有時被稱為輕量級進程(Lightweight Process,LWP),是程式執行流的最小單元。一個標準的線程由線程ID,當前指令指標(PC),寄存器集合和堆棧組成。”,簡單來說線程cpu執行程式調度的最小單元。cpu通過調用執行一個個線程來促使程式能夠正常運行。
線程、進程、應用程式之間的關係
在作業系統中一個進程就代表一個應用程式,如果將一個應用程式看做成一個實體的話,那進程就是一個正在啟動並執行實體。一個應用程式中可以包含多個線程,同樣進程中也可以包含多個線程,多個線程的組合稱為了一個應用程式,如果一個應用程式中只有一個線程時,那改線程就是一個用用程式,我們稱之為單線程程式!
java中如何建立線程
在java中有兩種建立線程的方式,一種是實現Runnable介面的run()方法並將其對象執行個體傳入Thread構造中來建立線程,一種是擴充Thread類的run方法來建立線程
1 new Thread(new Runnable() {2 public void run() {3 //省略該線程要執行的代碼4 }5 }).start();實現Runnable介面的方式
new Thread(){ @Override public void run() { //省略該線程要執行的代碼 super.run(); } }.start();擴充Thread類的方式
Thread類是java API提供的線程類,其通過start()方法來啟動線程,線上程啟動後執行run()方法中的代碼,當run()方法中的代碼執行完成後線程結束。在以上兩種建立線程的方式中推薦使用實現Runnable介面的方式建立線程,因為這種方式更符合物件導向思想,且不會破壞java API原有代碼的設計結構,擴充Thread類的方式不僅破壞了Java API原有的設計結構且不符合物件導向的設計思想。而且在Thread類的原始run()方法中也是調用Runable介面的run()方法來實現線程內容代碼的調用。
線程的幾種狀態
線程大致上可以分為五種狀態:建立、可運行(就緒)、阻塞(掛起)、運行、死亡。
建立:通過new Thread()來建立線程執行個體,但未調用start()方法。這時線程的執行個體已經被建立出來,但並沒有啟動該線程。
就緒:線程執行個體建立後調用start()方法。這時線程已經啟動,可以被JVM調度交由cpu執行,但cpu目前並沒有執行該線程。
運行:線程已經啟動,且已被JVM調度交由cpu執行,cpu正在執行該線程。
阻塞:線程在運行時,調用線程對象的sleep()、join()方法或該線程鎖定的監視對象的wait()方法時現場進入阻塞狀態,知道達到某種條件後進入就緒狀態。
死亡:當線程對象的run()方法執行結束,或在執行過程中出現錯誤導致線程異常結束,這時線程處於死亡狀態。
改變線程狀態的幾種方法詳解線程對象產生的方法
sleep():sleep方法使線程放棄cpu的使用權進入休眠狀態一段時間,這段時間過後線程自動進入就緒狀態。
join():join()方法使線程放棄cpu的使用權並加入另一該線程,當另一個線程運行結束進入死亡狀態後該線程自動進入就緒狀態,否則將一直處於阻塞狀態。
yield():yield()方法使線程暫時放棄cpu的使用權進入就緒狀態,但由於cpu的調度是隨機的無法幹預的所以有時yield()方法起不到任何效果。
start():start()方法使線程對象啟動進入就緒狀態。注意:start()方法只能線上程執行個體建立後調用一次,當線程進入死亡狀態時則無法再調用start()方法使其進入就緒狀態。
線程鎖定監視對象產生的方法
wait():wait()方法使當前線程放棄cpu的使用權和該對象的鎖,進入阻塞狀態知道其他線程調用該對象的notify()或notifyall()方法後進入就緒狀態。
notify():notify()方法檢測該對象上是否有等待的線程,若有一個或多個則隨機挑選一個線程使其進入就緒狀態。沒有則不進行任何操作。
notifyall():notifyall()方法檢測該對象上是否有等待的線程,若有則使其全部進入就緒狀態。沒有則不進行任何操作。