1.线程的创建和启动
Java使用Thread类代表线程,所有线程对象都必须是Thread类或者子类的实例。每条线程的作用是完成一定的任务,实际是就是执行一段程序流。Java使用run方法来封装这样一段程序流。
1)继承Thread类创建线程类
步骤如下:
定义Thread类的子类,并重写该类的run方法,该run方法的方法体就是代表了线程需要完成的任务。因此我们经常把run方法称为线程执行体。
创建Thread子类的实例,即床加你了线程对象。
用线程对象的start方法来启动该线程
public class ThreadTest extends Thread {
private int i;
public void run() {
for (; i < 100; i++) {
System.out.println(getName() + " " + i);
}
}
public static void main(String args[]) {
new ThreadTest().start();
new ThreadTest().start();
}
}
线程的一些方法:
Thread.currentThread():currentThread是Thread类的静态方法,该方法总是返回当前正在执行的线程对象。
getName():该方法是Thread的实例方法,该方法返回调用该方法的线程名字。
2)通过实现Runnable接口创建线程类
实现Runnable接口来创建并启动多条线程的步骤如下:
定义Runable接口的实现类,并重写该接口的run方法,该run方法的方法体同样是该线程的线程执行体。
创建Runnable实现类的实例,并以此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。
public class ThreadTest2 implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("当前线程"+Thread.currentThread().getName()+"在运行!");
}
public static void main(String args[]){
ThreadTest2 a= new ThreadTest2();
ThreadTest2 a1= new ThreadTest2();
Thread b= new Thread(a);
b.start();
new Thread(a1).start();
}
}
注意:Runnable进京位置Thread 对象的target,Runnable实现类里包含了run方法仅作为线程执行体,而实际的线程对象依然是Thread实例,只是该Thread线程负责执行其target的run方法。Java语言的Thread必须使用Runnable对象的run方法作为线程执行体。
2.线程的生命周期
线程生命周期有五种状态:
新建(New),就绪(Runnable),运行(Running),阻塞(Blocked)和死亡(Dead).
1)新建和就绪状态:
当程序使用new关键字创建了一个线程后,该线程就处于新建状态,此时它和其他Java对象一样,仅仅由Java虚拟机为其分配了内存,并初始化了其成员变量的值。此时线程对象没有表现出任何线程的动态特征。
当线程对象调用了start()方法之后,线程就处于就绪状态,Java虚拟机会为其创建方法调用栈和程序计数器,处于这个状态中的线程并没有开始运行,它只是表示线程可以运行了,至于该线程何时运行,取决于JVM里的线程调度器。
2)运行和阻塞状态
如果处于就绪状态的线程获得了CPU,开始执行run方法的线程执行体,则该线程处于运行状态
但是当发生如下情况时:线程进入阻塞状态
1.线程调用sleep方法主动放弃所占用的处理器资源。
2.线程调用了一个阻塞式的IO方法,该方法返回之前,该线程被阻塞
3.线程视图获得一个同步监视器,该同步监视器正好被其他线程所持有。
4.线程子啊等待某个通知
5.程序调用了suspend方法将线程挂起。
但是当前线程在如下几种情况下又可以解除阻塞,进入就绪状态
1.调用sleep方法的线程经过了指定的时间。
2.i线程调用的阻塞式IO方法已经返回
线程成功获得了同步监视器
线程正在等待某个通知时,其他线程发出了一个通知
处于挂起状态的线程调用了resume恢复方法。
3.线程死亡
线程会以以下三种方式结束,结束后就处于死亡状态:
1)run()方法执行完成,线程正常结束
2)线程poaching一个未捕获的Exception或Error
3)直接调用该线程的stop方法结束该线程,该方法容易导致死锁,不推荐使用。