java多线程:3 线程状态

版权声明:转载请标明来源 https://blog.csdn.net/u010652576/article/details/78569574

线程从创建到结束运行,经过多个状态,每个状态对应着不同的操作,具体如下:
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,这也是一个讲解线程和通讯的文章,也不错哦

猜你喜欢

转载自blog.csdn.net/u010652576/article/details/78569574