线程的生命周期

我们可以从java的Thread.State中发现线程有六种状态。分别是:

NEW:至今尚未启动的线程状态

RUNNABLE:可运行的线程的线程状态,包括正在运行的线程和就绪的线程。

BLOCKED:受阻塞并且正在等待监视器锁的某一线程的线程状态。

WAITING:某一等待线程的线程状态。

TIMED_WAITING:具有指定等待时间的某一线程的线程状态。

TERMINATED:以终止的线程的线程状态。线程已经结束执行。

下面我们分别用程序验证一下执行那些操作会处于其中某种状态。

public class Thread_A {
	public static void main(String[] args) {
		
		State s = new Thread(new Runnable(){
			@Override
			public void run() {
				System.out.println("线程A");				
			}			
		}).getState();
		System.out.println(s);//NEW
		
	}
}

我们可以发现刚创建的还没有调用start方法的线程处于NEW状态。

public class Thread_A {	
	static class B extends Thread{
		@Override
		public void run(){
			try{
				Thread.currentThread().sleep(20000);
			}catch(Exception e){				
			}
		}
	}
	public static void main(String[] args) throws InterruptedException {
		B b = new B();
		b.start();
		Thread.currentThread().sleep(1000);
		System.out.println(b.getState()); //TIMED_WAITING		
	}
}

调用sleep(long times)会是线程处于TIMED_WAITING状态。

public class Thread_A {	
	static class B extends Thread{
		@Override
		public void run(){
			try{				
			     Thread.currentThread().join();//调用join(),未设置等待时间		
			}catch(Exception e){				
			}
		}
	}
	public static void main(String[] args) throws InterruptedException {
		B b = new B();
		b.start();
		Thread.currentThread().sleep(1000);
		System.out.println(b.getState()); // WAITING	
	}
}

我们在当前线程中,调用它自己的join()方法,会使当前线程永远无法结束,所以会使线程当前线程(这里为b)的状态处于WAITING(无限期等待)状态。

public class Thread_A {	
	static synchronized void fun() throws InterruptedException{
		Thread.currentThread().sleep(100000);
		
	}
	static class B extends Thread{
		@Override
		public void run(){
			try{
				fun();
			}catch(Exception e){				
			}
		}
	}
	static class C extends Thread{
		@Override
		public void run(){
			try{
				fun();
			}catch(Exception e){				
			}
		}
	}
	public static void main(String[] args) throws InterruptedException {
		
		B b = new B();
		C c = new C();
		b.start();
		c.start();
		Thread.currentThread().sleep(100);
		System.out.println(c.getState());//BLOCKED	
		
	}
}

可以看到,多个线程竞争同一把锁,没竞争到的线程将陷入,线程等待IO资源的时候也会处于BLOCKED状态。

public class Thread_A {	
	static class B extends Thread{
		@Override
		public void run(){
			synchronized (this) {
				try {
					this.wait();
				} catch (InterruptedException e) {
					// TODO 自动生成的 catch 块
					e.printStackTrace();
				}				
			}
		}
	}
	public static void main(String[] args) throws InterruptedException {		
		B b = new B();
		b.start();
		Thread.sleep(100);
		System.out.println(b.getState());//WAITING
		
	}
}

从输出结果可以看出,调用wait()方法会使线程处于WAITING状态。

public class Thread_A {	
	static class B extends Thread{
		@Override
		public void run(){
			synchronized (this) {
				try {
					this.wait(1000);
				} catch (InterruptedException e) {
					// TODO 自动生成的 catch 块
					e.printStackTrace();
				}
				
			}
		}
	}
	public static void main(String[] args) throws InterruptedException {
		
		B b = new B();
		b.start();
		Thread.sleep(100);
		System.out.println(b.getState());//WAITING
		
	}
}

从输出结果可以看出,调用wait(long times)方法会使线程处于TIMED_WAITING状态。

线程运行结束就处于TERMINATED状态。

综上所述:

NEW:线程刚创建,还没调用start()方法。

RUNNABLE:线程此时可能正在运行或者处于就绪队列

WAITING:调用join()和wait()会使线程处于此状态。

TIMED_WAITING:调用sleep(long times)、join(long times)、wait(long times)会处于此状态

BLOCKED:访问同步代码块被阻塞会处于此状态,线程等待某种资源也会处于此状态。

TERMIDATED:线程运行结束,处于此状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值