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. 线程正尝试调用一个同步对象,但尚未取得该对象机锁。
下面的例子表现了一个完整的线程生命周期:
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] [全屏预览]
001 | import java.awt.event.ActionEvent; |
002 | import java.awt.event.ActionListener; |
003 | import javax.swing.JButton; |
004 | import javax.swing.JFrame; |
005 | import javax.swing.JLabel; |
006 | import javax.swing.JPanel; |
007 | import javax.swing.JTextField; |
008 | |
009 | |
010 | /** |
011 | * 线程的生命周期 |
012 | * 一个线程的生命周期分为四种状态:新生、可执行、停滞、死亡 |
013 | * 我们在本例中对一个线程进行上述操作 |
014 | * @author 五斗米 |
015 | * @blog http://blog.csdn.net/mq612 |
016 | */ |
017 | public class TestMain6 extends JFrame { |
018 | private MyThread thread = null ; // 要操作的线程 |
019 | private JTextField text = null ; // 运行计数器 |
020 | private JLabel label = null ; // 显示线程运行状态 |
021 | private JButton newButton = null , startButton = null , |
022 | waitButton = null , stopButton = null ; // 新生、启动、停滞、死亡 四个按钮 |
023 | private boolean isWait = false ; // 是否为暂停状态 |
024 | |
025 | /** |
026 | * 构造一个银行存取款界面 |
027 | */ |
028 | public TestMain6(){ |
029 | super ( "线程生命周期" ); |
030 | text = new JTextField( 25 ); |
031 | label = new JLabel( " " ); |
032 | newButton = new JButton( "新生" ); |
033 | newButton.addActionListener( new ActionListener(){ |
034 | public void actionPerformed(ActionEvent e) { |
035 | thread = new MyThread(); |
036 | label.setText( "新生" ); |
037 | } |
038 | }); |
039 | startButton = new JButton( "执行" ); |
040 | startButton.addActionListener( new ActionListener(){ |
041 | public void actionPerformed(ActionEvent e) { |
042 | thread.start(); |
043 | label.setText( "执行" ); |
044 | } |
045 | }); |
046 | waitButton = new JButton( "停滞" ); |
047 | waitButton.addActionListener( new ActionListener(){ |
048 | public void actionPerformed(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 = new JButton( "死亡" ); |
062 | stopButton.addActionListener( new ActionListener(){ |
063 | public void actionPerformed(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 = new JPanel(); |
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 | class MyThread extends Thread{ |
089 | private int i = 0 ; // 计数器数值 |
090 | private boolean b = true ; // 控制循环,也就是控制线程结束的boolean变量 |
091 | public MyThread(){ |
092 | i = 0 ; |
093 | text.setText(Integer.toString(i)); |
094 | } |
095 | |
096 | public void quit(){ |
097 | this .b = false ; |
098 | } |
099 | public synchronized void run(){ |
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 | public static void main(String [] args){ |
119 | new TestMain6(); |
120 | } |
121 | |
122 | } |