黑马程序员技术交流社区
标题:
多线程,是谁挂起了线程?
[打印本页]
作者:
岳伟伟
时间:
2012-4-26 09:30
标题:
多线程,是谁挂起了线程?
多个线程执行同步代码块,如果有线程在执行同步代码块,其他线程将被挂起
是谁挂起了这些线程呢?
同步代码块执行完毕后,其他线程又会被唤醒,又是谁唤醒了它们?
想了一晚上,大家帮忙!
作者:
刘永菲
时间:
2012-4-26 09:38
比较复杂,是由操作系统和JVM协作管理
用java命令启动一个java应用程序,就会启动一个JVM进程。在同一个JVM进程中,有且只有一个进程,就是它自己。在这个JVM环境中,所有程序代码的运行都是以线程来运行的。JVM找到程序的入口点main(),然后运行main()方法,这样就产生了一个线程,这个线程称之为主线程。当main方法结束后,主线程运行完成。JVM进程也随即退出。
操作系统将进程线程进行管理,轮流(没有固定的顺序)分配每个进程很短的一段时间(不一定是均分),然后在每个进程内部,程序代码自己处理该进程内部线程的时间分配,多个线程之间相互的切换去执行,这个切换时间也是非常短的。
由于线程何时执行是未知的,只有在CPU为线程分配到时间片时,线程才能真正执行。在线程执行的过程中,由可能会因为各种各样的原因而暂停。
作者:
liqian
时间:
2012-4-26 09:56
线程挂起的原因:
(1)通过调用sleep()方法使线程进入休眠状态,线程在指定时间内不会运行。
(2)通过调用join()方法使线程挂起,如果某个线程在另一个线程t上调用t.join(),这个线程将被挂起,直到线程t执行完毕为止。
(3)通过调用wait()方法使线程挂起,直到线程得到了notify()和notifyAll()消息,线程才会进入“可执行”状态。
线程挂起一般是自己将自己挂起,唤醒则是有其他线程唤醒的。
作者:
王敏NO.09
时间:
2012-4-26 10:11
如楼上所说,可以通过很多方法来设置挂起
调用sleep()、yield()、suspend()的时候并没有被释放锁
调用wait()的时候释放当前对象的锁
可以通过resume方法唤醒线程。
作者:
岳伟伟
时间:
2012-4-26 12:37
假设有同步函数fun();
线程1调用函数fun(),对象上锁,
此时再有线程2访问函数fun(),线程是处于冻结状态还是临时状态呢?
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2