java多线程:3 线程状态

线程从创建到结束运行,经过多个状态,每个状态对应着不同的操作,具体如下:
1 创建(new),2 可以运行(runnable)、3 运行(running)、4 等待(waiting)、5 阻塞(blocked)、6 结束(dead)

在这里插入图片描述

  1. 创建线程
    当通过new Thread的时候,这就创建了一个线程对象,注意此时仅仅是创建,还没有启动。
  2. 可以运行
    当调用start()方法后,线程就属于可运行状态,但是此时并没有真正的在cpu中进行运算,这需要等待cpu进行调度,分配时间片。
  3. 运行
    当cpu调度,分配时间片后,线程就是真正的运行了,可以进行相关的运算处理。此时线程就会出现不同的分支:1. 时间片使用完或者调用yield()让出cpu,重新返回到runnable状态。2 线程本身主动的调用wait(等待),处于等待状态(waiting)。3 线程因为线程之间的访问限制,或者主动的sleep,那么线程就处于阻塞(blocked)状态,例如:synchronized、lock、Thread.sleep()等,处于阻塞状态。
  4. 等待
    线程主动调用wait()方法或者wait(等待时间),那么当其他线程调用notyfy()/notyfyAll(),或者等待时间到了,那么线程就会处于可运行状态。
  5. 阻塞
    通过synchronized、lock、Thread.sleep()线程都是处于阻塞,这有其他线程释放了锁,或者线程的sleep被打断interrupt()。
  6. 结束 线程执行完run方法后,就可以认为线程运行结束,因此可以在run方法的最后,做线程运行结束的表明。
public class ThreadCreate {
	//list存储已经完成的thread对象,当然了使用ArrayList还是有缺陷的,因为list不能用于并发,但是为了方便暂时先使用。
	static List<Thread> list = new ArrayList<Thread>();
	public static void main(String[] args) throws InterruptedException {
		for(int i=0;i<10;i++){
			new Thread(new Runnable() {
				public void run() {
					//模拟线程计算
					int i = new Random().nextInt(100000)+1100;
					while(i>0){
						i--;
					}
					System.out.println(Thread.currentThread().getName()+" 完成计算-----");
					//add标明当前线程已经完成操作
					list.add(Thread.currentThread());
				}
			}).start();
		}
		//输出已经完成的线程
		while(list.size() != 10){
			for(int i =0;i<list.size();i++){
				System.out.println(list.get(i).getName()+" 结束");
			}
			System.out.println("-------------");
		}
	}
}

说明:上述代码还是存有一定的缺陷,但是主要是通过这种形式说明如何标明线程运行完成,  
因为当时特别蠢的思考了好长时间,如何判断线程是否完成。当然了判断是否结束运行,  
并不一定使用list进行存储,可以通过其他形式进行标明。  


说明:上述的线程图,是引用文章:https://www.cnblogs.com/wxd0108/p/5479442.html,这也是一个讲解线程和通讯的文章,也不错哦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值