java 多线程在竞争一个内部锁时,只有一个线程获得锁,其它线程状态是什么?是sleep还是runnable?

 我来答
百度网友cf9dc26
推荐于2018-04-27 · TA获得超过313个赞
知道答主
回答量:63
采纳率:0%
帮助的人:41.4万
展开全部

1.       程序通过Thread t = new Thread(),调用t.start()启动一个线程,使该线程进入可运行(Runnable)的状态。

2.       由JVM的决定去调度(Scheduler) 在可运行状态(Runnable)下的线程,使该线程处于运行 (Running) 状态,由于JVM的调度会出现不可控性,即不是优先级高的先被调用,可能先调用,也可能后调用的的情况。运行状态(Running)下,调用礼让yield()方法,可以使线程回到可运行状态(Runnable)下,再次JVM的调度(并不依赖优先级)。

3.       线程在Running的过程中可能会遇到阻塞(Blocked)情况

①.调用join()和sleep()方法,sleep()时间结束或被打断,join()中断,IO完成都会回到Runnable状态,等待JVM的调度。

②.调用wait(),使该线程处于等待池(wait blocked pool),直到notify()/notifyAll(),线程被唤醒被放到锁池(lock blocked pool ),释放同步锁使线程回到可运行状态(Runnable)

③.对Running状态的线程加同步锁(Synchronized)使其进入(lock blocked pool ),同步锁被释放进入可运行状态(Runnable)。

4.       线程run()运行结束或异常退出,线程到达死亡状态(Dead)

sleep和wait的区别有:

1,类:这两个方法来自不同的类分别是Thread和Object

2,锁:最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。

3,域:wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在

    任何地方使用

   synchronized(x){

x.notify()

//或者wait()

}

4,异:sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常

5,停:其实两者都可以让线程暂停一段时间,但是本质的区别是一个线程的运行状态控制,一个是线程之间的通讯的问题

notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。

notifyAll():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。

cygist
2012-01-27 · TA获得超过120个赞
知道答主
回答量:81
采纳率:0%
帮助的人:59.6万
展开全部
是等待状态. 其他线程一直会等待竞争到这个锁, 否则就会阻塞, 一直等待.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友8203537
2012-01-26 · 超过35用户采纳过TA的回答
知道小有建树答主
回答量:131
采纳率:0%
帮助的人:110万
展开全部
是wait
追问
线程状态有这样几种:New、Runnable、Blocked、Waiting、Timed waiting、Terminated

阻塞状态:当一个线程视图获取一个内部的对象锁,而该锁被其他线程持有,该线程就进入阻塞状态。当所有其他线程释放该锁,并且线程调度器允许本线程持有它的时候,该线程将变成非阻塞状态
如果同步块中没有调用wait()方法,那线程是怎么wait的呢,另外阻塞状态到底是什么状态?
追答
太多了,没法回答,自己领悟吧.一趟线程的课程45分钟,一堂肯定讲不完的,我要说的话不会比上边那位的字数少
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式