English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
java Object waitメソッド
スレッドBがある共有リソースにアクセスしようとし、リソースのロックオブジェクトを取得しようとすると、そのロックがすでにスレッドAによって取得されていることに気づきます。その場合、スレッドBはスレッドAがロックを解放するのを待たなければなりません。
ただし、ロックを取得したスレッドAが実行中に、ある条件がまだ満たされていないため、一時的に実行を続けたくないと考えて、少し待ちたいです(注意:これはすでにロックを取得したスレッドAが自発的に待ちたいです)。ある条件が満たされた後に、タスクの実行を続けたいと考えています。シンクロナイズドコードブロック内で、スレッドAはまずロックを解放しなければなりません。その後、スレッドBがロックを取得し、シンクロナイズドコードブロックに入り、コードを実行します。スレッドBが実行が完了すると、スレッドAが必要とする条件が満たされ、その場合、スレッドAを待機状態から実行状態に変えるための通知メカニズムが必要です。
有些同学认为线程A也可以一直循环判断,检查条件是否已经满足,而不一定要中断自己,然后等待。其实这种也是一种思路,但是呢?比较耗CPU,而且也不知道条件何时才能满足。
线程之间要协调沟通,必须有一个等待机制和通知机制,在JAVA里面,对应的就是wait方法和notify方法。
Object的wait方法
synchronized (obj) { while (condition does not ok){ obj.wait(); } }
如果想让线程A处于等待状态,可以调用当前对象wait方法。wait方法一旦被调用,也就意味着:线程A已经获得锁了,而且能做的事情都已经做了,现在只能等待了,等待另外的同步操作执行某些代码后,我才回来继续干活。
注意:
wait方法是定义在根类Object上的,Thread继承自Object类,自然也有wait方法。但是这里并不是调用当前线程对象的wait方法,而是具有锁属性的当前对象的wait方法;这一点我也不太理解,我觉得要做到线程A切换到等待状态,之后被人唤醒,就算使用线程A的wait方法和notify方法其实也是可以做到的,但是估计实现起来非常麻烦。另外从场景上看,wait定义在Object也比较合理,表示线程挂在了对象的等待池中。
ご読覧ありがとうございます。皆様のサポートに感謝します!