线程的创建和生命周期
线程的创建:
线程的创建有2种方法:
1、继承Thread方法,重写run方法
2、实现Runnable接口,实现run方法
第一种:
public class MyThread extends Thread{ private int i=10; @Override public void run() { while(i++<100){
//this.getName()获取当前执行的线程 Thread.currentThread()获得当前线程的名字 System.out.println(this.getName()+" "+Thread.currentThread()+" "+i); } } public static void main(String[] args) { MyThread my1=new MyThread(); my1.setName("Thread-1"); //给线程取个名字 MyThread my2=new MyThread(); my2.setName("Thread-2"); my1.start(); //开启线程 my2.start(); } }
第二种:
//一段源码 public class Thread implements Runnable{ Runnable target; @Override public void run() { if(target!=null){ target.run(); } } }
public class MyRunnable implements Runnable{ private int i; @Override public void run() { while(i++<100){
//没有this.getName()方法 System.out.println(Thread.currentThread().getName()+" "+i); } } public static void main(String[] args) { MyRunnable my1=new MyRunnable(); MyRunnable my2=new MyRunnable();
//Runnable 没有启动线程的方法,需要用Thread 类启动 Thread t1=new Thread(my1); t1.start(); Thread t2=new Thread(my2); t2.start(); } }
线程的生命周期:
1、当线程被创建并且启动后共经历了5种状态,新建、就绪、运行、阻塞、死亡
1)当线程对象被创建出来为新建状态
2)当执行start()方法时进入就绪状态,执行start()方法表明此线程可执行,至于什么时候执行取决于JVM调度,如果就绪的线程获得了CPU则为运行状态
3)线程进入阻塞状态的情况:
线程调用一个阻塞方法,方法返回前该线程一直阻塞。
线程调用sleep方法进入阻塞。
线程尝试获取同步监视器,但该同步监视器被其他线程持有。
线程调用了suspend方法挂起
4)线程解除阻塞,重新进入就绪状态的情况:
调用的阻塞方法返回。
调用的sleep到期。
线程成功获取同步监视器。
被suspend的方法挂起的线程被调用了resume方法恢复。
5)线程的死亡状态就是结束状态:
run()方法执行完毕
线程抛出异常
直接调用stop()方法
判断线程是否死亡可以调用 isAlive() 方法,处于就绪、运行、阻塞的线程返回true,否则返回false;
调用 stop和 suspend 会导致线程进入死锁状态
对已经死亡的线程不能调用start() 方法