Chinaunix首页 | 论坛 | 博客
  • 博客访问: 20145
  • 博文数量: 3
  • 博客积分: 1435
  • 博客等级: 上尉
  • 技术积分: 40
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-01 20:37
文章分类
文章存档

2011年(1)

2008年(2)

我的朋友
最近访客

分类: Java

2008-12-02 10:41:43

一:线程的生命周期
  1.创建状态
   创建一个线程而还没有启动它,则处于创建状态,此时仅是一个空得线程对象,并不获得应有得资源,只有启动后,系统才分配资源给它。
   此时可进行两种操作:一是通过调用start()方法启动,使其进入可运行状态,二是调用stop()方法,使其进入消亡状态
  2.可运行状态
    线程的创建状态中进行启动操作,则此线程进入可运行状态。可运行只说明它具备了运行的条件。
    在单处理系统中运行多线程程序,实际上每一时刻至多一个线程在运行,而系统中可能有多个线程都处于可运行状态,系统通过快速切换和调度所有可运行的线程共享处理器,造成宏观上得多线程并发。
    在可运行状态,线程运行得是线程体,线程体由run()方法规定,在自己定义得线程类中重写。
    此时可进行得操作:一是suspend(),使线程挂起;二是sleep(),使线程睡眠;三是wait(),使线程等待,以上三种均使线程进入不可运行状态。另外还可调用yield(),使线程退让,把CPU控制权提前交给同级优先权得其他线程;调用stop(),是线程终止进入消亡状态。
  3.不可运行状态
    不可运行状态由可运行状态转换而来,除了以上几种情况,另外一种是:如果一个线程是和IO操作有关得,则在执行IO操作指令时,线程会受到阻塞,此时也进入到不可运行状态。
    当线程处于此状态,可过下面途径恢复到可运行状态:通过sleep()方法进入的,在过了指定得睡眠时间后自动恢复;由于I/O的,在外设完成操作后自动恢复;通过suspend()的,通过resume()方法恢复;通过wait()方法的,通过调用notify()或者notifyAll()方法恢复。
    在不可运行状态,也可调用stop()使其进入消亡状态。
  4.消亡状态
   到此状态的线程其生命周期就结束了,不能转到其他状态。
   有两种情况使线程进入消亡状态:从可运行状态执行完run()方法,自然消亡;从任何其他一种状态调用stop()方法
二:线程得建立和使用
   1.使用Thread的子类创建线程
    通过对Thread类得继承派生一个子类,再由这个子类生成对象实现线程的创建
    参考步骤:
    从Thread类派生一个子类,下面代码实现了一个MyThread的子类
    class MyThread extends Thread{
         public void run(){}
    }
    重写run()方法,一个Thread类的内部结构使得总是执行线程本身的run方法
    生成类对象,创建线程
    MyThread myFirstThread=new MyThread();
    调用start方法,使之可运行状态
     MyFirstThread.start();
public class Main {
    public static void main(String[] args) {
        MyThread First=new MyThread("ZXP");//创建线程ZXP
        MyThread Second=new MyThread("ZXP@");//创建线程ZXP@

/谁先启动并不代表它会先执行,不信的人可以都运行几遍
        First.start();//启动线程ZXP
        Second.start();//启动线程ZXP@
    }

}
class MyThread extends Thread{
    public MyThread(String str){
        super(str);//为线程起名字

    }
    @Override
    public void run(){
        for(int i=0;i<5;i++){
            System.out.println(i+":"+getName());
            try {
                sleep((int) (Math.random()*1000));
            } catch (InterruptedException ex) {
                Logger.getLogger(MyThread.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        
    }
}

   2.直接使用Thread类创建线程
  使用Thread类得构造方法Thread(Runnable target)创建线程对象,target必须是一个具体的对象,该对象成为线程得目标对象,创建目标对象的类要实现Runnable接口。
   当线程调用start方法时,一旦轮到它用CPU,目标对象就会自动调用run方法。
import java.awt.*;
  import java.util.Date;
  import java.util.logging.Level;
  import java.util.logging.Logger;
  public class Clock extends java.applet.Applet implements Runnable{
    Thread clockThread;
    @Override
    public void start(){//applet必须实现的方法,
        if(clockThread==null){
            clockThread=new Thread(this,"Clock");//创建线程对象
            clockThread.start();//启动线程,使其进入可运行状态
        }
    }
    @SuppressWarnings("static-access")
    public void run() {     //创建目标对象的类实现Runnable接口,方法run
        while(clockThread!=null){
            repaint();//重新绘制,自动调用后面的paint方法
            try {
                clockThread.sleep(1000);
            } catch (InterruptedException ex) {
                Logger.getLogger(Clock.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    @Override
    public void paint(Graphics g){//绘制方法
        Font f=new Font("TimesRoman",Font.BOLD,24);//设置字体
        g.setFont(f);
        Date now=new Date();//获取当前系统时间
        g.drawString(now.getHours()+":"+now.getMinutes()+":"+now.getSeconds(),20,40);  //绘制文本,该方法在屏幕上显示字符串对象      
    }

}


阅读(1063) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:FilenameFilter的抽象方法如何被执行

给主人留下些什么吧!~~