java之執行緒thread生命週期?

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 }

相關問題答案