版权声明:转载请标明来源 https://blog.csdn.net/u010652576/article/details/78569574
线程从创建到结束运行,经过多个状态,每个状态对应着不同的操作,具体如下:
1 创建(new),2 可以运行(runnable)、3 运行(running)、4 等待(waiting)、5 阻塞(blocked)、6 结束(dead)
- 创建线程
当通过new Thread的时候,这就创建了一个线程对象,注意此时仅仅是创建,还没有启动。 - 可以运行
当调用start()方法后,线程就属于可运行状态,但是此时并没有真正的在cpu中进行运算,这需要等待cpu进行调度,分配时间片。 - 运行
当cpu调度,分配时间片后,线程就是真正的运行了,可以进行相关的运算处理。此时线程就会出现不同的分支:1. 时间片使用完或者调用yield()让出cpu,重新返回到runnable状态。2 线程本身主动的调用wait(等待),处于等待状态(waiting)。3 线程因为线程之间的访问限制,或者主动的sleep,那么线程就处于阻塞(blocked)状态,例如:synchronized、lock、Thread.sleep()等,处于阻塞状态。 - 等待
线程主动调用wait()方法或者wait(等待时间),那么当其他线程调用notyfy()/notyfyAll(),或者等待时间到了,那么线程就会处于可运行状态。 - 阻塞
通过synchronized、lock、Thread.sleep()线程都是处于阻塞,这有其他线程释放了锁,或者线程的sleep被打断interrupt()。 - 结束 线程执行完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,这也是一个讲解线程和通讯的文章,也不错哦