一:线程的生命周期
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) |