帮忙解释一下java中类的notify的含义,多谢了

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了帮忙解释一下java中类的notify的含义,多谢了相关的知识,希望对你有一定的参考价值。

guard是一个类,请问下面的代码是什么意思? 我要用c++来实现这段代码,请问应该如何实现呢? 多谢了! synchronized(guard) guard.notify();

1、notify()方法的含义:

(1)notify()方法是随机唤醒一个线程,将等待队列中的一个等待线程从等待队列中移到同步队列中。

(2)在执行完notify()方法后,当前线程不会马上释放该对象锁,呈wait状态的线程也不能马上获得该对象锁。

要等到执行notify方法的线程将程序执行完 ,也就是退出sychronized代码块后,当前线程才会释放锁。而在同步队列中的该线程才可以获取该对象锁。

2、对象所释放的三个场景:

(1)执行完同步代码块就会释放对象锁;

(2)在执行代码块的过程中,遇到异常而导致线程终止,也会释放对象锁;

(3)在执行同步代码块的过程中,执行了锁所属对象的wait()方法,这个线程会释放对象锁,而此线程对象会进入线程等待池中,等待被唤醒。

扩展资料

Java中notify和notifyAll的区别:

Java提供了两个方法notify和notifyAll来唤醒在某些条件下等待的线程,你可以使用它们中的任何一个,但是Java中的notify和notifyAll之间存在细微差别,这使得它成为Java中流行的多线程面试问题之一。

当你调用notify时,只有一个等待线程会被唤醒而且它不能保证哪个线程会被唤醒,这取决于线程调度器。

虽然如果你调用notifyAll方法,那么等待该锁的所有线程都会被唤醒,但是在执行剩余的代码之前,所有被唤醒的线程都将争夺锁定,这就是为什么在循环上调用wait。

因为如果多个线程被唤醒,那么线程是将获得锁定将首先执行,它可能会重置等待条件,这将迫使后续线程等待。

因此,notify和notifyAll之间的关键区别在于notify()只会唤醒一个线程,而notifyAll方法将唤醒所有线程。



参考技术A synchronized(guard) 是一个对象锁、用于代码同步、就是一个锁、 参考技术B notify()是java所有对象都具有的方法,继承子object类并且为final,不能重载。
其作用是唤醒一个等待的线程,时序一般是这样:

Thread t = new Thread( new Runnable()
public void run()

....

synchronized(guard)



guard.wait();//此处调用后该线程不再活动,置于等待状态,切换到其他线程运行



)
guard.notify(); 调用后虚拟机可选择任何一个调用了guard.wait()的线程投入运行,选择顺序不由代码控制,由虚拟机实现。

如果是notifyAll(),则唤醒所有等待的线程运行。

如果是用c++代码,一般要用到pthread库
pthread_cond_init创建一个所谓的等待条件,
可以在任何时间调用pthread_cond_wait进入等待,相当于调用guard.wait(),
其他线程可以调用pthread_cond_signal唤醒,相当于notify
还可以调用pthread_cond_braodcast,相当于notifyAll本回答被提问者和网友采纳
参考技术C “继承子object类并且为final,不能重载。” 如果是final类,应该是不能被重写。

java中类的组合机制

             经过课堂学习,了解了类的组合机制,之前只是介绍过java中类的继承,忽略了类的组合,今天补上。

          在java中如果一个类A中有你想要调用的方法,在你新建一个类B时,可以将想要用的类A的对象引用作为数据成员,就可以将类B看作是由类A组合而成的。

          以一个具体的例子,解释一下:

                       这个例子就是想创建一个类A,A有一个发射的方法,而已知的类FighterPlane有这个方法,所以就想用现成的方法,用到类的组合。目的是A的对象可以调用FighterPlane的方法,所以A类里面必须有一个FighterPlane对象的引用类型的数据成员,之后进行这个数据成员的初始化,要让它和一个FighterPlane的对象关联起来,即需要给A类的构造方法里传入实参,进行初始化。FighterPlane ftp = new FighterPlane("su35",10);这时产生了一个FighterPlane的对象和指向此对象的引用,之后 A  a   = new A(ftp); 则完成了A中的fp的初始化,A类的对象可以调用FighterPlane的方法了。

                   其实本质上就是A类的数据成员的数据类型比较特殊,但是同简单数据类型一样,也是进行初始化。另外,讲讲类的组合的优点,类的组合使用的是对象的引用,可以和不同的对象关联,但是在类的继承时,子类继承了父类所有的数据成员和方法,很笨重。因此尽量用组合,少用继承。

 

                                                               

                                                            

以上是关于帮忙解释一下java中类的notify的含义,多谢了的主要内容,如果未能解决你的问题,请参考以下文章

java 使用String中类的方法判断回文字符串

java中类的加载顺序介绍(ClassLoader)

PHP代码,能详细解释一下每行的意思么?多谢了

java中类修饰符都有哪些?

我是一个菜鸟,谁能帮忙解释一下一下代码?

Java语言中,下面关于类的描述正确的是()。(选择一项) 解释一下超类和子类。