谁能详细解释一下java中wait和notify在JVM中的运行机制啊?
答案:1 悬赏:70 手机版
解决时间 2021-04-01 00:31
- 提问者网友:龅牙恐龙妹
- 2021-03-31 05:36
谁能详细解释一下java中wait和notify在JVM中的运行机制啊?
最佳答案
- 五星知识达人网友:西岸风
- 2021-03-31 06:35
所有Java.lang.Object的子类都从Object类继续了3个wait和1个notity()及1个notifyAll()方法。具体的区别看相关的API。有时或者你还想使用sleep方法,notify方法的调用,会使当前线程进行阻塞状态,三个notify的区别,有的是直接加入到阻塞队列中,有的是阻塞一定的时间,但是不论哪种,没有本质区别,因为一旦加入到了阻塞队列,线程的优先级并不会改变,也就是说,只要你不去调用唤醒,注意是唤醒进程的notify()或者notifyAll()方法,线程会一直阻塞,除非你调用了,线程才会从阻塞状态变成可运行状态(runnable),注意是 可运行,并不是说立即马上就会执行,对于处于可运行状态的多个线程来说,由JVM根据当前线程池当中的可运行状态的线程的优先级来决定,Java中的线程执行是完成根据优先级抢占式执行的,也就是说,高优先级的线程会首先获得执行,当然正在运行的线程也会被比他高的线程把中断,至于中断的具体细节需要你写相关的代码测试,JVM实现这个功能的代码是不开源的。可能最让人迷惑的就是同优先级,或者默认优先级线程的执行顺序,我来告诉你,同优先级的顺序在JVM规范里是这么讲的:同优先级的线程的执行顺序是不确定的,JVM本身不支持多线程,JDK1.5时,当前1.6.24的版本不太清楚,除非当前JVM所在的操作系统支持多线程,就像现在的多核系统,JVM有可能会支持多线程的处理,注意JVM不具有跨平台性。。。,所以在多核下的多线程是一个非常值得测试的东西。除非当前的操作系统技术多线程,JVM才有可能支持多线程的处理,注意是有可能。并且JVM规范里说了,Java下所有在线程上的操作,程序的正确性永远不要依赖于线程的优先级。也就是说不要希望通过修改线程的优先级来决定程序执行顺序的正确性。解决这个问题最好的办法,我用的还是同步和互斥。通过他来共享操作。主要原因还是只有一个,同优先级线程并发执行是完全不可猜测的。完全随机,因素包括当前JVM的状态,可以这么想象一下,如果当前有多个线程需要执行,在JVM有限的资源上,不同的线程所要的资源和使用这些资源的时间是不同的,这也就决定了,在JVM的设计上,会根据一定的算法,来决定这些线程执行的顺序,否则同时装载几个需要大量资源的线程将导致JVM崩溃等等,其实是没有太大意义的,也顶多只是让当前线程进行可执行状态,进行等待队列,等待执行罢了。 希望你能明白。好长时间不看书,完全是看到这个问题,想起来的,可能有点乱。如果想再深入明白,包括线程具体是怎么实现的,可以找JVM规范相关的书看看。 对线程最好的学习,就是写程序测试线程,多设断点 ,来跟踪,通过每次执行的不同的可能的结果来经验化的学习。 最后说一句:notify() notifiAll()只会让线程从阻塞状态变成可执行状态,runnable 到 run状态,状态的变化是由JVM来完成。换句话说,就是程序里的run()方法的调用。 这种随机执行其实完全是因为特定的算法,和当前JVM的运行状态。换句话说,其实并不是真的随机。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯