package java.lang;public class Thread{public void start(); // 執行緒的啟動public void run(); // 執行緒體public void stop(); // 已廢棄public void resume(); // 已廢棄public void suspend(); // 已廢棄public static void sleep(long millis); // 在指定的毫秒數內讓當前正在執行的執行緒休眠public static void sleep(long millis, int nanos); // 同上,增加了納秒引數public boolean isAlive(); // 測試執行緒是否處於活動狀態public void interrupt(); // 中斷執行緒public boolean isInterrupted(); // 測試執行緒是否已經中斷public static boolean interrupted(); // 測試當前執行緒是否已經中斷public void join() throws InterruptedException; // 等待該執行緒終止public void join(long millis) throws InterruptedException; // 等待該執行緒終止的時間最長為 millis 毫秒public void join(long millis, int nanos) throws InterruptedException; // 等待該執行緒終止的時間最長為 millis 毫秒 + nanos 納秒}重點:停滯狀態1. 通過sleep(millis)使執行緒進入休眠,該方法在指定的時間內無法被喚醒。2. 通過suspend()暫停執行緒,除非執行緒收到resume()訊息,否則不會變回可執行狀態。(該方法已經廢棄)3. 通過wait() 暫停執行緒,除非收到notify()或notifyAll()訊息,否則不會變回可執行狀態。wait()和notify()兩個函式都是Object的一部分,不像sleep()那樣屬於Thread,這是因為兩個函式會取用物件的機鎖,而機鎖正是每個繼承自Object物件都擁有的。如此一來我們可以把wait()置於任何同步函式內,也只能在同步函式中呼叫wait()。sleep()、suspend()、resume()可以在所有非同步函式中使用,因為它們不會取用機鎖。4. 執行緒正在等待某個IO動作完成。5. 執行緒正嘗試呼叫一個同步物件,但尚未取得該物件機鎖。下面的例子表現了一個完整的執行緒生命週期:
1. [程式碼]TestMain6.java 跳至[1][全屏預覽]
view sourceprint?
001 importjava.awt.event.ActionEvent;
002 importjava.awt.event.ActionListener;
003 importjavax.swing.JButton;
004 importjavax.swing.JFrame;
005 importjavax.swing.JLabel;
006 importjavax.swing.JPanel;
007 importjavax.swing.JTextField;
008
009
010 /**
011 * 執行緒的生命週期
012 * 一個執行緒的生命週期分為四種狀態:新生、可執行、停滯、死亡
013 * 我們在本例中對一個執行緒進行上述操作
014 * @author 五斗米
015 * @blog
016 */
017 publicclassTestMain6 extendsJFrame {
018 privateMyThread thread = null; // 要操作的執行緒
019 privateJTextField text = null; // 執行計數器
020 privateJLabel label = null; // 顯示執行緒執行狀態
021 privateJButton newButton = null, startButton = null,
022 waitButton = null, stopButton = null; // 新生、啟動、停滯、死亡 四個按鈕
023 privatebooleanisWait = false; // 是否為暫停狀態
024
025 /**
026 * 構造一個銀行存取款介面
027 */
028 publicTestMain6(){
029 super("執行緒生命週期");
030 text = newJTextField(25);
031 label = newJLabel(" ");
032 newButton = newJButton("新生");
033 newButton.addActionListener(newActionListener(){
034 publicvoidactionPerformed(ActionEvent e) {
035 thread = newMyThread();
036 label.setText("新生");
037 }
038 });
039 startButton = newJButton("執行");
040 startButton.addActionListener(newActionListener(){
041 publicvoidactionPerformed(ActionEvent e) {
042 thread.start();
043 label.setText("執行");
044 }
045 });
046 waitButton = newJButton("停滯");
047 waitButton.addActionListener(newActionListener(){
048 publicvoidactionPerformed(ActionEvent e) {
049 if(!isWait){ // 如果不是暫停狀態
050 isWait = true;
051 waitButton.setText("繼續");
052 }else{
053 isWait = false;
054 synchronized(thread){
055 thread.notify(); // 繼續
056 }
057 waitButton.setText("停滯");
058 }
059 }
060 });
061 stopButton = newJButton("死亡");
062 stopButton.addActionListener(newActionListener(){
063 publicvoidactionPerformed(ActionEvent e) {
064 if(isWait){
065 isWait = false;
066 synchronized(thread){
067 thread.notify();
068 }
069 }
070 thread.quit();
071 label.setText("死亡");
072 }
073 });
074 JPanel pane = newJPanel();
075 pane.add(label);
076 pane.add(text);
077 pane.add(newButton);
078 pane.add(startButton);
079 pane.add(waitButton);
080 pane.add(stopButton);
081 this.getContentPane().add(pane);
082 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
083 this.setSize(300, 200);
084 this.setLocationRelativeTo(null);
085 this.setVisible(true);
086 }
087
088 classMyThread extendsThread{
089 privateinti = 0; // 計數器數值
090 privatebooleanb = true; // 控制迴圈,也就是控制執行緒結束的boolean變數
091 publicMyThread(){
092 i = 0;
093 text.setText(Integer.toString(i));
094 }
095
096 publicvoidquit(){
097 this.b = false;
098 }
099 publicsynchronizedvoidrun(){
100 while(b){
101 if(isWait){ // 這裡決定了執行緒何時停滯
102 try{
103 wait(); // 只能在同步函式中呼叫wait()
104 } catch(InterruptedException ex) {
105 ex.printStackTrace();
106 }
107 }
108 text.setText(Integer.toString(i++));
109 try{
110 this.sleep(100);
111 } catch(InterruptedException ex) {
112 ex.printStackTrace();
113 }
114 }
115 }
116 }
117
118 publicstaticvoidmain(String [] args){
119 newTestMain6();
120 }
121
122 }