当前位置: 首页 > news >正文

政府网站建设 政府采购如何在百度推广自己

政府网站建设 政府采购,如何在百度推广自己,深圳建设集团大厦,传媒公司业务范围介绍java:线程等待与唤醒 - Object的wait()和notify() 1 前言 java使用Object类的wait()和notify()方法,可以实现线程等待和唤醒(Object类为所有类的父类,即所有类天然具有线程等待和唤醒的方法,一般使用Object类的wait(…

java:线程等待与唤醒 - Object的wait()和notify()

1 前言

java使用Object类的wait()和notify()方法,可以实现线程等待和唤醒(Object类为所有类的父类,即所有类天然具有线程等待和唤醒的方法,一般使用Object类的wait()和notify()方法即可)。

使用wait()、notify()时,有一些注意点,比如wait和notify方法需在同步代码块(synchronized 代码块)或方法(方法包含锁实例对象的synchronized实例方法,以及锁类对象的synchronized static方法)中使用,一般成对出现。

在一般执行时,还具有先后顺序的强依赖,即先执行wait,再执行notify,若先执行notify,再执行wait,后续无线程唤醒操作时,阻塞的线程将无法被唤醒。

2 使用

使用前,先关注下java文档中的说明:

* This method should only be called by a thread that is the owner
* of this object's monitor. A thread becomes the owner of the
* object's monitor in one of three ways:
* <ul>
* <li>By executing a synchronized instance method of that object.
* <li>By executing the body of a {@code synchronized} statement
*     that synchronizes on the object.
* <li>For objects of type {@code Class,} by executing a
*     synchronized static method of that class.
* </ul>* Only one thread at a time can own an object's monitor.
*
* @throws  IllegalMonitorStateException  if the current thread is not
*               the owner of this object's monitor.
* @see        java.lang.Object#notifyAll()
* @see        java.lang.Object#wait()
public final native void notify();* This method should only be called by a thread that is the owner
* of this object's monitor. See the {@code notify} method for a
* description of the ways in which a thread can become the owner of
* a monitor.
*
* @throws  IllegalMonitorStateException  if the current thread is not
*               the owner of the object's monitor.
* @throws  InterruptedException if any thread interrupted the
*             current thread before or while the current thread
*             was waiting for a notification.  The <i>interrupted
*             status</i> of the current thread is cleared when
*             this exception is thrown.
* @see        java.lang.Object#notify()
* @see        java.lang.Object#notifyAll()
*/
public final void wait() throws InterruptedException {wait(0);
}

上述表明,notify执行时,若当前线程不是Object的monitor的持有者,则抛出IllegalMonitorStateException。

判断是否当前线程持有Object的monitor,即上述提到的3个方式,要么在synchronized代码块中执行object.wait()或object.notify(),要么就是synchronized实例方法,此时synchronized锁对象为实例对象,若是synchronized static 方法,则synchronized锁对象为类对象,注意不同方式使用不同的锁对象即可,此3种方式表示当前线程为Object的monitor持有者,可以顺利执行wait()或notify()方法,反之则抛出IllegalMonitorStateException。

常见的使用方式如下:

public class TestObjectWaitAndNotify {private Object lockObj = new Object();private void doSubmit(){System.out.println("成功提交!");}public void run() throws Exception{AtomicBoolean f = new AtomicBoolean(false);new Thread(() -> {synchronized (this.lockObj){System.out.println(Thread.currentThread().getName() + "开始执行");while(!f.get()){try {this.lockObj.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println(Thread.currentThread().getName() + "执行结束");doSubmit();}}, "xiaoxu1").start();TimeUnit.SECONDS.sleep(2);new Thread(() -> {synchronized (this.lockObj){System.out.println(Thread.currentThread().getName() + "开始执行");f.set(true);this.lockObj.notify();System.out.println(Thread.currentThread().getName() + "执行结束");}}, "xiaoxu2").start();}public static void main(String[] args) throws Exception{TestObjectWaitAndNotify n = new TestObjectWaitAndNotify();n.run();}
}

执行结果如下:

xiaoxu1开始执行
xiaoxu2开始执行
xiaoxu2执行结束
xiaoxu1执行结束
成功提交!

上述执行时,因为对象的监视器monitor含有该对象的锁、阻塞队列和同步队列,执行lockObj.wait()时,除了使当前线程进入阻塞队列,还需要释放锁(否则后续执行synchronized (this.lockObj)的第二个线程无法获取到锁并执行唤醒操作),然后后续休眠2秒后,第二个线程执行synchronized (this.lockObj),再次获取到锁(锁需是同一个对象的monitor持有的锁),执行唤醒操作,即阻塞队列中的休眠线程被再次唤醒并执行,执行后续的doSubmit(),且因为标志位改变,故而不再发起wait,整个过程结束。

另Object.notifyAll()方法,即唤醒当前阻塞队列的全部休眠线程(唤醒操作意即,notify、notifyAll会将阻塞队列中的线程,放入同步队列中等待执行,同时竞争锁失败的线程,也会放入同步队列中等待同步执行)。

注意,上述线程的等待和唤醒操作,因为加锁(synchronized决定了第一个线程会先于第二个线程获取到锁)和代码顺序,故而是先等待,再唤醒;若代码顺序为先唤醒,再等待,即便操作都加上synchronized(加上synchronized,保证了wait先执行,notify后执行),但因为代码操作顺序改变,阻塞队列没有休眠线程,此时再次执行wait,线程1将被一直阻塞无法唤醒。故wait()和notify()具有先后执行顺序的强依赖关系。

http://www.mmbaike.com/news/82327.html

相关文章:

  • 衡阳城乡建设部网站首页手机网站
  • 啥也不懂怎么建设网站西安建站推广
  • 福州网站定制设计简单的个人主页网站制作
  • 网站的空间和域名是啥公司关键词seo
  • 中国建设银行网站用户名宁波seo推广方式排名
  • 建立网站商城建议东莞网站制作的公司
  • 怎么利用快站做网站酒店网络营销推广方式
  • 猪八戒网网站开发需求网络营销专员的就业前景
  • now9999网站提示建设中域名被墙查询检测
  • c java 网站开发爱站网长尾挖掘工具
  • 手机微网站开发平台推广营销
  • 怎样做彩票网站安卓手机优化神器
  • 可以做别人的网站上挂一个网页吗黄页88网推广服务
  • 莱阳网站建设网络广告的发布方式包括
  • 制作网站开发百度用户服务中心官网
  • 西安网站建设首选定制建站网站建设
  • 企业网站后台管理系统模板seowhy
  • 做网站 给图片加链接app用户量排名
  • 网站建设首先要选择题优化师的工作内容
  • 程序开源网站网络销售的工作内容
  • 哪些网站做夜场女孩多2345浏览器影视大全
  • 网站导航页面模板长沙网站制作关键词推广
  • 网站开发的方法深圳网络广告推广公司
  • 网站开发设计方案2024年重启核酸
  • 茶道网站开发背景windows优化大师有什么功能
  • 苏州展厅设计公司排名搜索引擎优化的定义
  • android获取Wordpress数据库贵港seo
  • 新闻源网站怎么做网站开发公司
  • 华电集团班组建设网站色盲测试图看图技巧
  • 重庆教育集团建设公司网站网店运营怎么学