java中,线程有五种状态:创建,就绪,运行,阻塞,死亡
创建:生成线程对象,但并没有调用该对象的start方法,则线程处于创建状态
就绪:当调用了线程的start方法后,该线程就进入了就绪状态,但此时线程调度程序还没把该线程设置为当前线程,此时就处于就绪状态,在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。
运行:线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始执行run函数中代码。
阻塞:线程正在运行的时候,被暂停,通常是为了等待某个时间的发送(比如某资源就绪)之后,再继续运行。sleep,suspend,wait等方法都可以导致线程阻塞。
死亡:如果一个线程的run方法执行结束或者调用stop方法之后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪。
实现并启动线程的两种方法
1,写一个类继承Thread类,重写run方法,用start启动线程。
2,写一个类实现Runnable接口,实现run方法,使用new Thread(Runnable target).start()方法来启动。
注意,非必须情况,不要使用run方法启动,否则,会一直处于线程中,导致其他代码停止执行,除非调用stop或run方法执行结束线程,才会继续执行其他逻辑。
调用start方法之后,线程会被放到等待队列,等待cpu调度,并不一定马上执行,只是处于就绪状态。
1,start()方法来启动线程,真正实现了多线程运行。这时,无需等待run方法体代码执行完毕,可以直接继续执行下面的代码。通过Thread类的start()方法来启动一个线程,此时线程处于就绪状态,并没有运行,然后通过此Thread类调用方法run()来完成其运行操作。方法run()为线程体,它包好了要执行的这个线程的内容。run方法运行结束,此线程终止。
2,run()方法作为普通方法的方式被调用,程序还是要顺序执行,要等到run方法体执行完毕之后,才能继续执行下面的代码。则会出现程序中只有主线程这一个线程,程序执行路径还是只有一条,这样就没有达到写线程的目的。
class hello extends Thread { public hello() { } public hello(String name) { this.name = name; } public void run() { for (int i = 0; i < 5; i++) { System.out.println(name + "运行 " + i); } } public static void main(String[] args) { hello h1=new hello("A"); hello h2=new hello("B"); h1.run(); h2.run(); } private String name;
运行结果
A运行 0
A运行 1
A运行 2
A运行 3
A运行 4
B运行 0
B运行 1
B运行 2
B运行 3
B运行 4
public static void main(String[] args) { hello h1=new hello("A"); hello h2=new hello("B"); h1.start(); h2.start(); }
运行结果
A运行 0
B运行 0
B运行 1
B运行 2
B运行 3
B运行 4
A运行 1
A运行 2
A运行 3
A运行 4
感谢:http://blog.csdn.net/xuxurui007/article/details/7685076