A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 岳伟伟 初级黑马   /  2012-4-26 09:30  /  2256 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

多个线程执行同步代码块,如果有线程在执行同步代码块,其他线程将被挂起
是谁挂起了这些线程呢?
同步代码块执行完毕后,其他线程又会被唤醒,又是谁唤醒了它们?
想了一晚上,大家帮忙!

评分

参与人数 1技术分 +1 收起 理由
职业规划-刘倩老师 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
比较复杂,是由操作系统和JVM协作管理
用java命令启动一个java应用程序,就会启动一个JVM进程。在同一个JVM进程中,有且只有一个进程,就是它自己。在这个JVM环境中,所有程序代码的运行都是以线程来运行的。JVM找到程序的入口点main(),然后运行main()方法,这样就产生了一个线程,这个线程称之为主线程。当main方法结束后,主线程运行完成。JVM进程也随即退出。

操作系统将进程线程进行管理,轮流(没有固定的顺序)分配每个进程很短的一段时间(不一定是均分),然后在每个进程内部,程序代码自己处理该进程内部线程的时间分配,多个线程之间相互的切换去执行,这个切换时间也是非常短的。

由于线程何时执行是未知的,只有在CPU为线程分配到时间片时,线程才能真正执行。在线程执行的过程中,由可能会因为各种各样的原因而暂停。
回复 使用道具 举报
线程挂起的原因:
(1)通过调用sleep()方法使线程进入休眠状态,线程在指定时间内不会运行。
(2)通过调用join()方法使线程挂起,如果某个线程在另一个线程t上调用t.join(),这个线程将被挂起,直到线程t执行完毕为止。
(3)通过调用wait()方法使线程挂起,直到线程得到了notify()和notifyAll()消息,线程才会进入“可执行”状态。
线程挂起一般是自己将自己挂起,唤醒则是有其他线程唤醒的。
回复 使用道具 举报
如楼上所说,可以通过很多方法来设置挂起
调用sleep()、yield()、suspend()的时候并没有被释放锁
调用wait()的时候释放当前对象的锁
可以通过resume方法唤醒线程。
回复 使用道具 举报
假设有同步函数fun();
线程1调用函数fun(),对象上锁,
此时再有线程2访问函数fun(),线程是处于冻结状态还是临时状态呢?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马