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] [全屏预览]

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(300200);
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 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值