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

wordpress迅雷下载优化设计

wordpress迅雷下载,优化设计,做类似电驴网站,云南省住房和建设厅网站目录 前言 一、wait() 方法 1.方法介绍 2.代码示例 3.wait 和 sleep 的区别 二、notify() 方法 1.方法介绍 2.代码示例 三、notifyAll() 方法 1.方法介绍 2.代码示例 结尾 前言 由于线程之间是抢占式执行的,因此线程之间的执行顺序是难以预知的&#xf…

目录

·前言

一、wait() 方法

1.方法介绍

2.代码示例

3.wait 和 sleep 的区别

二、notify() 方法

1.方法介绍

2.代码示例

三、notifyAll() 方法

1.方法介绍

2.代码示例

·结尾


·前言

        由于线程之间是抢占式执行的,因此线程之间的执行顺序是难以预知的,但是在我们进行多线程编程中,很多时候我们希望能合理的协调多个线程之间的执行先后顺序,本篇文章就是来进行介绍协调多个线程之间的执行先后顺序的方法,那就是使用wait() 方法、notify() 方法和notifyAll() 方法。

一、wait() 方法

1.方法介绍

        wait 方法和 join 方法用法和作用相似,都可以协调多个线程之间的执行先后顺序,但是使用 join 方法是要等待另一个线程执行完,才能继续执行,使用 wait 方法则是等待另一个线程通过 notify 方法来通知就可以继续执行,wait 方法做的事情有以下几点:

  • 使当前执行代码的线程进行等待(把线程放入等待队列中);
  • 释放当前的锁;
  • 满足一定条件时被唤醒,再重新尝试获取这个锁。

        wait 方法结束等待的条件有以下几条:

  1. 其他线程调用该对象的 notify 方法;
  2. wait 等待时间超时(wait 方法有一个带有 timeout 参数的版本,可以指定等待的时间) ,避免出现死等的情况;
  3. 其他线程调用该线程的 interrupted 方法,导致 wait 方法抛出异常。

2.代码示例

        wait 方法使用时一定是要搭配 synchronized 关键字来使用,如果脱离 synchronized 使用 wait 方法就会直接抛出异常,如下面代码及运行结果所示:

public class WaitDeom {public static void main(String[] args) throws InterruptedException {Object object = new Object();System.out.println(" wait 之前....");object.wait();System.out.println(" wait 之后....");}
}

        上述代码中是直接调用了 wait 方法,此时出现的异常名称是“非法的监视器异常”,synchronized 也叫做“监视器锁”,锁对象,就像“监控”一样,一调用 wait 方法就需要释放锁,但是释放锁的前提是得先拿到锁,所以 wait 方法必须方法 synchronized 中使用。

        介绍完 wait 方法为什么一定要在 synchronized 中使用后,我来对上述有问题的代码进行修改,修改后的代码及运行结果如下所示:

public class WaitDeom {public static void main(String[] args) throws InterruptedException {Object object = new Object();synchronized (object) {System.out.println(" wait 之前....");object.wait();System.out.println(" wait 之后....");}}
}

         我们可以发现,上面的代码在 wait 方法这里阻塞了,此时我们使用 jconsole 工具来观察线程状态,如下图所示:

         调用完 wait 方法之后程序就会一直等待下去(这里调用的 wait 是没有带 timeout 参数的版本,所以会进行死等),但是我们不希望这个程序一直这么等待下去,此时就需要使用另一个方法来唤醒线程,那就是 notify() 方法。

3.wait 和 sleep 的区别

        wait 方法和 sleep 方法的效果有一些相似之处,在使用方法上也有一些相似之处,先介绍一下这两个方法类似的地方:

        在 wait 方法中,提供了一个带有超时时间的版本,sleep 方法也可以指定时间,他们都是时间到,就可以继续执行解除阻塞了,并且,wait 和 sleep 都可以被提前唤醒(虽然时间没有到,但是可以被提前唤醒)wait 通过 notify 来唤醒,sleep 通过 interrupt 唤醒。

        在介绍这两个方法的区别之前,还是要强调一下,理论上这两个方法并没有可比性,这是因为 wait 方法是用于线程之间的通信,sleep 方法是让线程阻塞一段时间,唯一相同的就是这两个方法都可以让线程放弃执行一段时间,所以上面类似的地方,也仅仅是类似。

        使用 wait 时一定是不知道要等多长时间的前提下使用,所以他带有超时时间的版本就是为了“兜底”,大多数情况下 wait 方法都是在超时时间之内被唤醒了。

        使用 sleep 方法时一定是知道要等待多少时间的前提下使用的,虽然可以被提前唤醒,但是这并非一个正常的操作,因为在使用 sleep 方法时,我们就是希望这个线程在指定时间到达后被准时唤醒,而非被异常唤醒。

        介绍这两个方法的区别最明显的还是以下两点:

  1. wait 方法需要搭配 synchronized 来使用,而使用 sleep 方法不需要;
  2. wait 方法是 Object 类中的方法,而 sleep 方法是 Thread 的静态方法。

二、notify() 方法

1.方法介绍

        notify() 方法的作用是唤醒等待的线程,它有以下几点注意事项:

  1. notify() 方法需要在 synchronized 的代码块或用 synchronized 修饰的方法中进行使用,notify() 方法是用来通知那些可能等待该锁对象的其他线程,对其他线程发出通知 notify 并使它们重新获取锁对象;
  2. 调用 notify 方法时,如果有多个线程等待,就会有线程调度器随机调度出一个 wait 状态的线程,并不是按照“先来后到”的顺序进行调度;
  3. 在调用 notify 方法后,当前的线程不会立刻释放当前的锁对象,而是需要等当前调用 notify 方法的线程将当前 synchronized 代码块中代码执行完之后才会释放锁对象。

         再强调一下,使用 notify 方法时一定要注意 wait 方法和 notify 方法彼此是通过锁对象来联系起来的,比如当前有两个锁对象:object1 与 object2 ,然后执行了 object1.wait()  , object2.notify() 此时执行的 notify 方法就无法唤醒!只有这两个对象一样才能唤醒。

2.代码示例

        通过上面对 notify 方法的介绍,在这里还是用具体的代码示例来演示一下吧,代码及运行结果如下所示:

// 测试 notify() 方法功能
public class NotifyDemo {public static void main(String[] args) {// 创建一个锁对象Object object = new Object();Thread t1 = new Thread(()->{synchronized (object) {System.out.println(" wait 之前");try {object.wait();} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(" wait 之后");}});Thread t2 = new Thread(()->{// 让 t2 线程先休眠 2s 是为了让 t1 线程先执行到 wait() 方法try {Thread.sleep(2000);} catch (InterruptedException e) {throw new RuntimeException(e);}synchronized (object){System.out.println("使用 notify 唤醒 wait");object.notify();// 这里休眠两秒是为了观察调用完 notify() 方法后会不会立即释放锁对象System.out.println("休眠 2 秒观察");try {Thread.sleep(2000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});// 启动两个线程t1.start();t2.start();}
}

        上述代码就可以很好的演示了 notify() 方法的作用。 

三、notifyAll() 方法

1.方法介绍

        在上面介绍了 notify() 方法只是唤醒调用这个对象上诸多等待线程中的某一个线程,使用 notifyAll() 方法则是可以唤醒这个对象上所有等待的线程,假设我们创建的很多线程,这些线程都使用了同一个对象调用了 wait 方法,针对这个对象调用 notifyAll 方法就会将这些线程全部唤醒。但是需要注意,这些线程在 wait 状态被唤醒后是需要重新获取锁的,就会产生锁竞争,此时哪个线程先拿到锁,哪个线程后拿到锁就不确定了。

2.代码示例

        介绍完 notifyAll() 方法之后,还是以一个代码示例来演示一下 notifyAll() 的具体效果吧,代码及运行结果如下所示:

// 测试 notifyAll() 方法
public class NotifyAllDemo {public static void main(String[] args) {Object locker = new Object();Thread t1 = new Thread(()->{synchronized (locker) {System.out.println("执行线程 t1 的 wait 方法前");try {locker.wait();} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("t1 线程被唤醒");}});Thread t2 = new Thread(()->{synchronized (locker) {System.out.println("执行线程 t2 的 wait 方法前");try {locker.wait();} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("t2 线程被唤醒");}});Thread t3 = new Thread(()->{synchronized (locker) {System.out.println("执行线程 t3 的 wait 方法前");try {locker.wait();} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("t3 线程被唤醒");}});Thread t4 = new Thread(()->{// 休眠 t4 线程 3s 让前三个线程先执行完 wait 方法try {Thread.sleep(3000);} catch (InterruptedException e) {throw new RuntimeException(e);}synchronized (locker) {System.out.println("唤醒全部线程.....");locker.notifyAll();}});// 启动所有线程,观察结果t1.start();t2.start();t3.start();t4.start();}
}

        通过上面代码运行结果可以发现,两次运行结果并不相同,这是因为将所有调用 wait 方法进行等待的线程唤醒之后,它们会重新进行锁竞争,此时无法保证哪个线程先拿到锁,然后先执行,所以相比之下,我个人通知线程醒来还是更倾向用 notify() 方法,因为使用 notifyAll() 方法将所有等待线程唤醒后不好控制。 

·结尾

        文章到此也就要结束了,本篇文章介绍了线程的等待通知,等待使用 wait() 方法,通知使用的是 notify() 方法和 notifyAll() 方法,这样配合的一组方法可以让我们更合理的协调多个线程之间的执行顺序,这也是我们使用 Java 进行多线程编程中的基础知识,如果本篇文章对您有帮助,希望能得到您的三连支持,同样,如果对本篇文章的知识有所疑惑,也可以在评论区或者私信留言哦,您的支持是我最大的动力,我们下篇文章再见吧~~~

http://www.hkea.cn/news/9298/

相关文章:

  • 做网站需要看什么书sem和seo是什么职业岗位
  • 怎样做幼儿园网站手机端百度收录入口
  • 王爷不敢当网站关键字优化
  • 哪些网站可以医生做兼职网站策划是做什么的
  • 网站开发也需要源码吗谷歌官方app下载
  • 新闻热点事件及评论seo咨询河北
  • 门户网站建设工作的自查报告品牌营销策划公司哪家好
  • wordpress参数传递的函数德州seo优化
  • 国外做的比较好的展台网站怎么开通百度推广账号
  • 如何做单页网站seo概念的理解
  • 文化传媒公司起名字大全免费长春seo代理
  • 有哪些站内推广的方式app有哪些推广方式
  • wordpress 3.7.1 漏洞湖北seo网站推广
  • 炒股网站怎么做广州百度竞价开户
  • 如何去国外网站看内容短视频精准获客系统
  • 做网站的公司赚钱吗高清视频网络服务器
  • 群站wordpress百度网页版主页网址
  • 做国外网站汇款用途是什么移动营销
  • 简约创意情人节海报设计上海高端seo公司
  • 杭州个人做网站优化新十条
  • wordpress mo文件长沙seo排名收费
  • 怎样办网站seo关键词优化提高网站排名
  • 手机网站制作天强科技郑州专业seo首选
  • 设计师做单页的网站seo关键词查询
  • 广州正规网站建设公司chrome官网
  • 网站 内容 不收录 权重 1手机建立一个免费网站
  • 网站在开发过程中如何做SEO个人介绍网页制作
  • 丝袜怎么做的视频网站seo搜索引擎优化业务
  • 建筑网站绿地新里城公司做网络推广怎么做
  • 资产管理公司网站建设费用怎么入账网页制作作业100例