一、Java中多线程的生命周期
Java中的一个线程有5个状态:
1.新建状态(new):当线程被创建了,该线程就进入新建状态,如 Thread t= new Thread();
2.就绪状态(Runnable):当线程调用了start()方法,线程就进入就绪状态,如t.start( ),此时该线程不是马上执行,而是等待CPU分配资源调度;
3.运行状态(Running):当CPU开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。注:就 绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中;
4.阻塞状态(Blocked):处于运行中的线程,可能因为某些原因而放弃对CPU的使用,进入阻塞状态,直到该线程再次进入就绪状态(Runnable),才有机会被执行。阻塞状态有三种:
(1)等待阻塞:执行wait( )方法,线程进入等待阻塞状态,等待notify( )进入同步阻塞状态,直到获得同步锁,重新进入就绪状态。
(2)同步阻塞:线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态,直到获得同步锁,重新进入就绪状态;
(3)其他阻塞:线程还有可能通过sleep( ) 或 join() 或 发出I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线 程重新转入就绪状态。
5.死亡状态(Dead):线程执行完毕,或因异常退出run( )方法,程序死亡。
二、Java中创建多线程主要有两种方法,一种是继承Thread类,一种是继承Runnable接口。下面创建一个猫类,让它的实体作为一个线程,在控制台上输出“Hello World”十次,输完停止该线程。
1.继承Thread类。
在main方法里面创建继承了Thread的类的实体c1,启动实体的线程,就是调用Thread类的start()函数,start将启用线程,并调用run()函数。
public class Demo1{
public static void main(String[]args) {
Cat c1=new Cat();
c1.start();
}
}
创建一个猫类,继承Thread类,复写run()方法,用while(true)循环执行线程。
class Cat extends Thread {
int times=0;
public void run() {
while(ture) {
try {
Thread.sleep(1000);
} catch (InteruptedException e) {
e.printStackTrace();
}
System.out.println("Hello world!");
times++;
if(times==10)
break;
}
}
}
2.用Runnable接口实现多线程。创建新的应用了Runnable接口的实体c2,在创建一个线程t,将该实体传入该线程,再将该线程启动。
public class Demo2 {
public static void main(String[]args) {
Cat c2=new Cat();
Thread t=new Thread(c2);
t.start();
}
}
猫类应用了Runnable的接口,复写run()方法,写法和继承Thread类一样。
public class Cat implements Runnable {
int times=0;
public run() {
whlile(true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace;
}
System.out.println("Hello World!");
times++;
if(times==10)
break;
}
}
}