您的位置:首页 > 编程语言 > Java开发

JAVA线程对象的状态

2010-08-10 12:28 295 查看
JAVA线程对象的状态

1. 概述
在Thread类中定义了线程的6种状态:新建态,就绪态、运行态,阻塞态、等待态、终止态。
1) 新建态:使用new运算符创建一个线程对象(new Thread)后,该线程仅仅是一个空对象,系统没有为它分配资源,该线程处于新建态(NEW)。
2) 就绪态和运行态
从操作系统角度来看,处于新建态的线程启动后,进入就绪态,再由操作系统调度执行而成为运行态。由于线程调度是由操作系统控制和管理,程序无法控制。所以,从程序设计角度看,线程启动后即进入运行态(RUNNABLE),程序中不需要区分就绪态或运行态。
进入运行态的线程对象,系统执行线程对象的run()方法。
3)阻塞态和等待态
一个运行态的线程因某种原因不能继续运行时,进入阻塞态(BLOCKED)或等待态。处于阻塞态或等待态的线程不能执行,即使处理器空闲也不能执行。只有当引起阻塞的原因被消除,或等待的条件满足时,线程再转入运行态,重新进入线程队列排队等待运行,再次运行时即从暂停处继续执行。
导致线程进入阻塞态或等待态的原因有很多种,如输入/输出、等待消息、睡眠、锁定等。等待态有两种WAITING和TIMED_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线程一个初步认识。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: