參考書:瘋狂java講義,java程序設計基礎。java
1新建狀態(newborn)當一個Thread類或者其子類的對象被聲明或者是建立,但沒有執行的這段狀態稱爲新建狀態。dom
2.就緒狀態(runnable)就緒狀態也稱爲可運行狀態。處於新建狀態的線程被啓動後,將進入線程列隊排隊等候cpu的調度,此時具有了運行的條件,也就是就緒狀態。學習
3.運行狀態(Runing)就緒狀態的線程得到cpu的調度並得到系統資源後便進入了運行狀態。線程
處於運行狀態的線程在一下狀況下將讓出cpu的控制權設計
●線程運行完畢。code
●有比當前優先級更高的線程處於就緒狀態。對象
●線程主動睡眠一段時間。繼承
●線程正在等待某一資源。接口
4.阻塞狀態(blocked)一個運行的線程在某些特殊的狀況下將讓出cpu,並暫時停止本身的執行。線程處於這種不可運行的狀態稱爲阻塞狀態。下面幾種狀況下可使一個線程進入阻塞狀態。隊列
●調用sleep()或者yield()方法。
●等待一個條件變量線程調用wait()方法。
●該線程與另外一個線程join()在一塊兒。
一個線程被阻塞時不能進入排隊隊列,阻塞的緣由被消除時才能進入就緒狀態。阻塞狀態的線程一般須要某些事件才能喚醒,睡眠狀態的線程必須阻塞一段固定時間。
5.消亡狀態(dead)處於消亡狀態的線程不具有繼續執行的能力,致使線程消亡的緣由有兩個:一是執行了run()方法的最後一條語句,二是進程中的線程被強制終止。
線程的調度與優先級:java語言支持搶佔調度模型,每一個線程都被賦予一個執行的優先級。從1到10整數型。Thread類有三個優先級的靜態變量MIN_PRIORITY(1),MAX_PRIORITY(10),NORM_PRIORITY(5)。
建立線程:
經過繼承Thread類來建立線程的步驟以下。
1.定義Thread類的子類並重寫該類的run方法。該run()方法體稱爲線程執行體。
2.建立Thread類的子類實列,即建立線程對象。
3.調用線程對象的start()方法。
package Test; class MyThread extends Thread { private String who; public MyThread(String str) { who=str; } public void run() { for(int i=0;i<5;i++) { try { sleep((int)(1000*Math.random())); } catch(InterruptedException e) { } System.out.println(who+"正在運行"); } } } public class App11_1 { public static void main(String[] args) { MyThread you=new MyThread("你"); MyThread she=new MyThread("她"); you.start(); she.start(); System.out.println("主方法main運行結束"); } }
主方法main運行結束
她正在運行
你正在運行
她正在運行
你正在運行
她正在運行
你正在運行
你正在運行
你正在運行
她正在運行
她正在運行
--------------------------------------------------------
實現Runnable藉口建立線程:
●定義Runnable藉口實現類,並重寫Run方法,該Run()方法一樣是線程的執行體。
●建立藉口實現類的實例,並以實例做爲Thread類的參數。該Thread對象纔是真正的線程對象。
package Test; class MyThread_ implements Runnable { private String who; public MyThread_(String str) { who=str; } public void run() { for(int i=0;i<5;i++) { try { Thread.sleep((int)(Math.random()*1000));//注意sleep方法是Thread類的 } catch(InterruptedException e) { } System.out.println(who+"正在運行"); } } } public class App11_2 { public static void main(String[] args) { MyThread_ you=new MyThread_ ("你"); MyThread_ she=new MyThread_("她"); Thread a=new Thread(you); Thread b=new Thread(she); a.start(); b.start(); System.out.println("Main方法執行完畢"); } }
使用callable和Future建立線程。
建立並啓動有返回值的線程步驟以下。
1.建立callable接口實現類,並實現call()方法,該call()方法將作線程的執行體,且該call()方法有返回值。
2.建立Callable實現類的實列,使用FutureTask類來包裝Callable對象,該FutureTask對象封裝該Callable對象的call()方法的返回值。
3.使用FutureTask對象做爲Thread對象參數建立並啓動線程。
4.調用FutureTask對象的get()方法來得到子線程執行結束後的返回值。
import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; public class ThirdThread implements Callable<Integer> { //實現call()方法,實現線程執行體 public Integer call() { int i=0; for( ;i<100; i++) { System.out.println(Thread.currentThread().getName()+"的循環變量i的值:"+i); } return i; } public static void main(String[] args) { ThirdThread rt=new ThirdThread(); //使用FutureTask類來包裝Callable對象。 FutureTask<Integer> task= new FutureTask<Integer>(rt); for(int i=0;i<100;i++) { System.out.println(Thread.currentThread().getName()+"的循環變量i的值:"+i); if(i==20) { //實際仍是以Callable來建立對象。並啓動線程。 new Thread(task,"有返回值的線程").start(); } try { System.out.println("子線程的返回值:"+task.get()); } catch(Exception e) { } } } }
學習筆記,若有錯誤歡迎指正