「java中线程的四种状态」java中线程的四种状态是什么

博主:adminadmin 2022-12-25 05:21:07 72

今天给各位分享java中线程的四种状态的知识,其中也会对java中线程的四种状态是什么进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

java多线程有哪些状态?

初始态:一个线程调用了new方法之后,并在调用start方法之前的所处状态。

就绪:一旦线程调用了start 方法,线程就转到Runnable 状态。

阻塞/ NonRunnable:线程处于阻塞/NonRunnable状态,这是由两种可能性造成的:要么是因挂起而暂停的,要么是由于某些原因而阻塞的,例如包括等待IO请求的完成。

停止/退出:线程转到退出状态,这有两种可能性,要么是run方法执行结束,要么是调用了stop方法。

Java中线程的可用状态有哪些?

Java中线程的可用状态有下面几种:

就绪(Runnable):线程准备运行,不一定立马就能开始执行。

运行中(Running):进程正在执行线程的代码。

等待中(Waiting):线程处于阻塞的状态,等待外部的处理结束。

睡眠中(Sleeping):线程被强制睡眠。

I/O阻塞(BlockedonI/O):等待I/O操作完成。

同步阻塞(BlockedonSynchronization):等待获取锁。

死亡(Dead):线程完成了执行。

线程的基本概念及线程与进程的关系

线程的基本概念:线程指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一个线程,也就是程序本身。

Java中的线程有四种状态分别是:运行、就绪、挂起、结束。

一个程序中可以有多条执行线索同时执行,一个线程就是程序中的一条执行线索,每个线程上都关联有要执行的代码,即可以有多段程序代码同时运行,每个程序至少都有一个线程,即main方法执行的那个线程。如果只是一个cpu,它怎么能够同时执行多段程序呢?这是从宏观上来看的,cpu一会执行a线索,一会执行b线索,切换时间很快,给人的感觉是a,b在同时执行,好比大家在同一个办公室上网,只有一条链接到外部网线,其实,这条网线一会为a传数据,一会为b传数据,由于切换时间很短暂,所以,大家感觉都在同时上网。

状态:就绪,运行,synchronize阻塞,wait和sleep挂起,结束。wait必须在synchronized内部调用。

调用线程的start方法后线程进入就绪状态,线程调度系统将就绪状态的线程转为运行状态,遇到synchronized语句时,由运行状态转为阻塞,当synchronized获得锁后,由阻塞转为运行,在这种情况可以调用wait方法转为挂起状态,当线程关联的代码执行完后,线程变为结束状态。

基于java 线程的几种状态

下面是java 线程的5种状态:

1、新建(new)

新建一个线程的对象。

2、可运行(runable)

线程对象创建后,其他线程调用该线程的start方法。或者该线程位于可运行线程池中等待被线程调用,已获取cpu的使用权。

3、运行(running)

可运行的线程获取了cpu的使用权,执行程序代码

4、阻塞(block)

由于某些原因该线程放弃了cpu的使用权。停止执行。除非线程进入可运行的状态,才会有机会获取cpu的使用权。

(1)等待阻塞:运行中的线程执行wait方法,这时候该线程会被放入等待队列。

(2)同步阻塞:运行中的线程获取同步锁,如果该同步锁被别的线程占用,这个线程会成被放入锁池,等待其他线程释放同步锁。

(3)其他阻塞:运行的线程执行sleep或者join方法这个线程会成为阻塞状态。当sleep超时,join等待线程终止,该线程会进入可运行状态。

5、死亡(dead)

线程run mian 执行完毕后,或者因为某些异常产生退出了 run 方法,该线程的生命周期结束。

Java线程的几种状态

线程是一个动态执行的过程,它有一个从产生到死亡的过程,共五种状态:

1、新建(new Thread)

当创建Thread类的一个实例(对象)时,此线程进入新建状态(未被启动)

例如:Thread t1=new Thread();

2、就绪(runnable)

线程已经被启动,正在等待被分配给CPU时间片,也就是说此时线程正在就绪队列中排队等候得到CPU资源。例如:t1.start();

3、运行(running)

线程获得CPU资源正在执行任务(run()方法),此时除非此线程自动放弃CPU资源或者有优先级更高的线程进入,线程将一直运行到结束。

4、堵塞(blocked)

由于某种原因导致正在运行的线程让出CPU并暂停自己的执行,即进入堵塞状态。

正在睡眠:用sleep(long t) 方法可使线程进入睡眠方式。一个睡眠着的线程在指定的时间过去可进入就绪状态。

正在等待:调用wait()方法。(调用notify()方法回到就绪状态)

被另一个线程所阻塞:调用suspend()方法。(调用resume()方法恢复)

5、死亡(dead)

当线程执行完毕或被其它线程杀死,线程就进入死亡状态,这时线程不可能再进入就绪状态等待执行。

自然终止:正常运行run()方法后终止

异常终止:调用stop()方法让一个线程终止运行

(二)线程状态、wait/notify

在java中线程一共有6种状态。分别为:

sleep不会释放锁(CPU时间片),在存在锁的情况下,线程会一直占有锁,其他线程无法获取。

wait会释放锁,允许其他线程进入同步方法。在调用notify唤醒后会重新去获取锁。

sleep可以在任意地方使用,没有限制。

wait只能在同步方法中使用,依赖于锁。

问题:假如有一个生产者消费者需求:生产者线程对恭喜资源 Integer lock 每次执行加1,达到5以后唤醒消费者,消费者线程每次对Integer lock进行减1,到0时唤醒生产者。在这种情况下,Integer即作为共享资源,又作为锁的对象。那么这种情况会有什么问题呢?

答:问题是无法互相唤醒。

由于消费者是在lock = 0时执行 notify、wait操作,生产者是在lock = 5时执行 notidy、wait操作,因此两个lock其实不是同一个对象,无法执行唤醒。

Synchorized锁

wait/notify 是基于synchorized实现的,await/signal是基于Lock实现的(LookSupport),JUC中提供了Condition类await/signal来代替wait/notify,而Condition底层就是基于park/unpark做的线程通讯。不仅是Condition,AQS中也使用了park/unpark,可以理解为await/signal是park/unpark的外层封装。

wait/notify无法控制唤醒谁,随机唤醒(没有分组的概念)

await/signal可以,await/signal支持多个condition消费者一组,生产者一组,这样在多生产者消费者时可以确保唤醒的一定是分组内的。

答:没有锁的情况是不可以使用的。

可以试想,什么情况下才需要用到等待/唤醒场景呢?

以吃饭举例,到饭店吃饭,点完餐以后自己就进入等待状态(等着吃饭),需要等待服务员唤醒(餐好了通知),此类场景我们就需要用到等待、唤醒。

那么此时需要考虑,如果吃饭的人多了,那么我们怎么知道“餐好了”是谁的餐好了?服务员又怎么知道“餐好了我该叫哪位顾客”?现实场景中我们都是有座位号,或者取餐号,那么这个座位号、取餐号就是我们的锁,我获取到这把锁(其他顾客无法再获取),那么我与我点的餐之间就有了一个关联关系。服务员就可以通过这把锁来对我进行唤醒(1号的餐好了~)。

java中线程的四种状态的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java中线程的四种状态是什么、java中线程的四种状态的信息别忘了在本站进行查找喔。

The End

发布于:2022-12-25,除非注明,否则均为首码项目网原创文章,转载请注明出处。