当前位置: 首页 > 科技观察

谈谈你对Java线程的5条状态流原理的理解

时间:2023-03-18 15:06:39 科技观察

1。线程定义在回答线程流程原理的问题之前,我们先来回顾一下JDK中自定义线程的3种方式,以及它们的优缺点。第一种:就是继承Thread类。如代码所示:publicclassMyThreadextendsThread{publicvoidrun(){//todosomething}}这种方法的优点是:实现简单,只需实例化一个继承类的实例即可使用线程。它的缺点是:缺乏可扩展性,Java是一种单继承的语言,如果一个类继承了其他的类,就不可能通过这种方式实现自定义线程。第二种方法实现Runnable接口,如代码所示:,非常适合一个资源场景的多线程处理。它的缺点是:构造线程实例的过程比较繁琐。第三种:实现Callable接口,如代码所示:publicclassMyThreadimplementsCallable{publicStringcall()throwsException{//todosomethingreturnnull;}}它的优点是:扩展性好,可以支持回调和获取返回值,可以抛出已检查的异常。它的缺点是相对于Runnable接口的实现方式,调用过程比较繁琐。2.线程状态流动的原理首先我们来看这样一张图,它涵盖了Java中多线程的所有重要知识点。如果你掌握了这张图,你就基本掌握了Java中的多线程。从图中可以看出,线程状态的流程包括以下五种情况:(1)新状态(New):线程对象创建后,进入新状态。例如Threadthread=newThread()。(2)就绪状态(Runnable):也称为“可执行状态”。线程对象创建后,其他线程调用线程的start()方法启动线程。此时线程处于就绪状态,随时可能被CPU调度执行。(3)运行状态(Running):表示线程在获得CPU资源后正在运行。需要注意的是,一个线程只能从就绪态进入运行态。(4)阻塞状态(Blocked):表示线程由于某种原因放弃了CPU的使用权,暂时停止运行。直到线程进入就绪状态,才有机会进入运行状态。那么,阻塞分为三种情况:1)等待阻塞是指通过调用线程的wait()方法让线程等待。2)同步阻塞是指当一个线程在获取synchronized同步锁时,由于锁被其他线程占用导致获取失败,将进入同步阻塞状态。3)其他阻塞是指当调用线程的sleep()方法或join()方法或发出I/O请求时,线程会进入阻塞状态。当sleep()状态超时,join()等待线程终止或超时,或者I/O处理完成,线程再次转入就绪状态。(5)死亡状态(Dead):表示线程结束执行或因异常退出run()方法,线程结束生命周期。下面我举一个简单的例子来解释一下上面的五种状态。比如我们平时去商场上厕所。当我们准备上厕所时,就是新状态(new)。如果我们需要排队上厕所,队列就是就绪状态(Runnable)。有个坑。轮到你了,蹲坑是奔跑状态(Running)。蹲在坑里,发现没有卫生纸。你需要等别人拿纸来。此状态为阻塞(Blocked)。等你从厕所出来,上厕所的事情就结束了。线程不存在了,是死状态。需要注意的是,便秘也是一种阻塞状态。如果你便秘时间太长,别人会等不及,可能会把你赶走。这是挂机。另一种情况是便秘占坑太久,别人叫你出去冲泡一会儿,5分钟后再回来蹲坑。这叫做睡眠。好了,以上就是我对线程状态流动原理的理解。