JAVA线程对象的状态

来源:互联网 发布:ps cs4 mac破解版 编辑:程序博客网 时间:2024/05/22 09:48

JAVA线程对象的状态

1.       概述

Thread类中定义了线程的6种状态:新建态,就绪态、运行态,阻塞态、等待态、终止态。

1)  新建态:使用new运算符创建一个线程对象(new Thread)后,该线程仅仅是一个空对象,系统没有为它分配资源,该线程处于新建态(NEW)。

2)  就绪态和运行态

从操作系统角度来看,处于新建态的线程启动后,进入就绪态,再由操作系统调度执行而成为运行态。由于线程调度是由操作系统控制和管理,程序无法控制。所以,从程序设计角度看,线程启动后即进入运行态(RUNNABLE),程序中不需要区分就绪态或运行态。

进入运行态的线程对象,系统执行线程对象的run()方法。

3)阻塞态和等待态

一个运行态的线程因某种原因不能继续运行时,进入阻塞态(BLOCKED)或等待态。处于阻塞态或等待态的线程不能执行,即使处理器空闲也不能执行。只有当引起阻塞的原因被消除,或等待的条件满足时,线程再转入运行态,重新进入线程队列排队等待运行,再次运行时即从暂停处继续执行。

导致线程进入阻塞态或等待态的原因有很多种,如输入/输出、等待消息、睡眠、锁定等。等待态有两种WAITINGTIMED_WAITING,前者的等待时间不确定,后者的等待时间确定。

4)终止态

线程对象停止运行未被撤销时总是终止态的(TERMINATED)。导致线程终止有两种原因:运行结束或被强制停止。当线程对象的run()方法执行结束时,该线程对象进入终止态,等待系统撤销对象所占用的资源;当进程因故障停止运行时,该进程中的所有线程将被强行终止。

2.       Thread类中改变和片段线程状态的方法

Thread 类中定义了start(),sleep(),interrupt()等多个改变线程状态的方法,以及isAlive(),isInterrupt()等判断线程状态的方法。线程的运行机制如下图所示:

 

 

 

3.       实例:滚动字显示线程状态及改变方法.

本例演示了线程对象的生命周期从创建到终止的过程,其中使用了new(),start(),sleep(),interrupt()等方法改变线程的状态。程序运行的界面如下图所示:

 

程序如下:

import java.awt.*;

import java.awt.event.*;

 

import javax.swing.*;

 

public class WelcomeJFrame extends JFrame

{

private JDialog dialog;

private JLabel labelDialog;

public WelcomeJFrame(String[] texts)

{

           super("滚动字");

           this.setSize(400,300);

           this.setLocation(300, 240);

           this.setDefaultCloseOperation(EXIT_ON_CLOSE);

          

           if(texts == null || texts.length == 0)

                    this.add(new RollbyJPanel("Welcome!"));

           else

           {

                    this.setLayout(new GridLayout(texts.length,1));

                    for(int i = 0; i < texts.length; i++)

                   {

                             this.add(new RollbyJPanel(texts[i]));

                    }       

           }

           this.setVisible(true);

          

           dialog = new JDialog(this,"提示",true);

           dialog.setSize(240,80);

           labelDialog = new JLabel("",JLabel.CENTER);

           dialog.add(labelDialog);

           dialog.setDefaultCloseOperation(HIDE_ON_CLOSE);

}

public WelcomeJFrame()

{

           this(null);

}

private class RollbyJPanel extends JPanel implements ActionListener,Runnable

{

           private JTextField textWord,textSleep;

           private JButton buttonStart,buttonInterrupt;

           private JTextField textState;

           private Thread threadRollby;

           private int sleepTime;

          

           private RollbyJPanel(String text)

           {

                    this.setLayout(new GridLayout(2,1));

                    for(int i = 0; i < 100; i++)

                             text = text +" ";

                    textWord = new JTextField(text);

                    this.add(textWord);

                   

                    JPanel panelSub = new JPanel(new FlowLayout(FlowLayout.LEFT));

                    this.add(panelSub);

                    panelSub.add(new JLabel("sleep"));

                   

                    this.sleepTime = (int) (Math.random()*100);

                    textSleep = new JTextField("" + sleepTime,5);

                    panelSub.add(textSleep);

                    textSleep.addActionListener(this);

                   

                    buttonStart = new JButton("启动");

                    panelSub.add(buttonStart);

                    buttonStart.addActionListener(this);

                   

                    buttonInterrupt = new JButton("中断");

                    panelSub.add(buttonInterrupt );

                    buttonInterrupt .addActionListener(this);

                   

                    threadRollby = new Thread(this);

                    buttonInterrupt.setEnabled(false);

                   

                    panelSub.add(new JLabel("state"));

                    textState = new JTextField("" + threadRollby.getState(),10);

                    textState.setEditable(false);

                    panelSub.add(textState);

           }

           @Override

           public void run()

           {

                    // TODO Auto-generated method stub

                    while(threadRollby.isAlive() && !threadRollby.isInterrupted())

                    {

                             try

                             {

                                       String str = textWord.getText();

                                       str = str.substring(2)+ str.substring(0, 2);

                                       textWord.setText(str);

                                       threadRollby.sleep(sleepTime);

                             }

                             catch(InterruptedException e)

                             {

                                       break;

                             }

                    }

}

           @Override

           public void actionPerformed(ActionEvent e)

           {

                    // TODO Auto-generated method stub

                    if(e.getSource() == buttonStart)

                    {

                             threadRollby = new Thread(this);

                             threadRollby.start();

                             textState.setText("" + threadRollby.getState());

                             buttonStart.setEnabled(false);

                             buttonInterrupt.setEnabled(true);

                    }

                    if(e.getSource() == buttonInterrupt)

                    {

                             threadRollby.interrupt();

                             textState.setText("" + threadRollby.getState());

                             buttonStart.setEnabled(true);

                             buttonInterrupt.setEnabled(false);

                    }

                    if(e.getSource() == textSleep)

                    {

                             try

                             {

                                       sleepTime = Integer.parseInt(textSleep.getText());

                             }

                             catch(NumberFormatException nfe)

                             {

                                       labelDialog.setText("/"" + textSleep.getText() + "/" 不能转换成整数,请重新输入!" );

                                       dialog.setLocation(this.getX() + 200, this.getY() + 200);

                                       dialog.setVisible(true);

                             }

                    }

           }

}

 

public static void main(String[] args)

{

           // TODO Auto-generated method stub

           String[] texts = {"hello","java","thread"};

           new WelcomeJFrame(texts);

}

}

4.       总结

这个实例讨论了JAVA线程对象的状态,及其怎样实现线程状态的改变以及线程对象状态的读取。这只是对JAVA线程一个初步认识。

 

 

原创粉丝点击