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

网站建设条件想学网站建设优化去哪

网站建设条件,想学网站建设优化去哪,华夏网站建设,网站权重有时降更多内容请点击了解 本篇文章将详细讲述wait和notify的区别,请往下看 目录 更多内容请点击了解 文章目录 一、wait和notify概念 二、wait()方法详解 三、notify()方法详解 代码如下: 3.1notifyAll()详解 四、wait和sleep的对比 一、wait和notif…

更多内容请点击了解

本篇文章将详细讲述wait和notify的区别,请往下看


目录

更多内容请点击了解

文章目录

一、wait和notify概念

二、wait()方法详解

三、notify()方法详解

代码如下:

3.1notifyAll()详解

四、wait和sleep的对比


一、wait和notify概念

由于线程之间是抢占式执行的, 因此线程之间执行的先后顺序难以预知,但是实际开发中有时候我们希望合理的协调多个线程之间的执行先后顺序

wait:让当前线程进入等待状态

notify:唤醒在当前对象上等待的线程

注意: wait, notify, notifyAll 都是 Object 类的方法.

wait和notify一定要搭配synchronized来使用,没有synchronized会抛出异常!!!

举个例子:

一群滑稽老铁准备去ATM取钱,一号老铁要取钱,进去之后,发现ATM没钱了,那么他出来了,一直等到ATM里面有钱再进去,那么接下来几号老铁进去拿钱就是随机的,不确定的,为了解决这个情况,可以使用wait和notify来解决。

二、wait()方法详解

wait做的事情:

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

wait 结束等待的条件:

  1. 其他线程调用该对象的 notify 方法
  2. wait 等待时间超时 (wait 方法提供一个带有 timeout 参数的版本, 来指定等待时间)
  3. 其他线程调用该等待线程的 interrupted 方法, 导致 wait 抛出 InterruptedException 异常

代码如下:

public class waitDemo {public static void main(String[] args) throws InterruptedException {Object object = new Object();synchronized (object) {System.out.println("等待中");object.wait();System.out.println("等待结束");}}
}

可以发现程序一直在运行,没有停止,就说明一直在wait,这样在执行到object.wait()之后就一直等待下去,那么程序肯定不能一直这么等待下去了。这个时候就需要使用到了另外一个方法唤醒的方法notify()

wait还提供了一个带有参数的方法,参数指定的是最大等待时间,不带参数的wait就是死等,带参数的wait就会等最大时间之后,还没人通知,就自己唤醒自己。

 使用wait,阻塞等待会让线程进入WAITING状态

三、notify()方法详解

notify 方法是唤醒等待的线程

  1. 方法notify()也要在同步方法或同步块中调用,该方法是用来通知那些可能等待该对象的对象锁的其它线程,对其发出通知notify,并使它们重新获取该对象的对象锁。
  2. 如果有多个线程等待,则有线程调度器随机挑选出一个呈 wait 状态的线程。(并没有 "先来后到")
  3. 在notify()方法后,当前线程不会马上释放该对象锁,要等到执行notify()方法的线程将程序执行完,也就是退出同步代码块之后才会释放对象锁。

代码如下:

public class ThreadDemo {public static void main(String[] args) throws InterruptedException {Object locker = new Object();Thread t1 = new Thread(() -> {try {System.out.println("wait 开始");synchronized (locker) {locker.wait();}System.out.println("wait 结束");} catch (InterruptedException e) {e.printStackTrace();}});t1.start();Thread.sleep(1000);Thread t2 = new Thread(() -> {synchronized (locker) {System.out.println("notify 开始");locker.notify();System.out.println("notify 结束");}});t2.start();}
}

 t1先执行,执行到wait,就阻塞了,1s后t2开始执行,执行到notify就会通知t1线程唤醒,(注意,notify是在synchronized内部,就需要t2释放了锁,t1才能继续往下走),加锁的是同一个locker 

3.1notifyAll()详解

 

notify方法只是唤醒某一个等待线程. 使用notifyAll方法可以一次唤醒所有的等待线程,

可以有多个线程,等待同一个对象,唤醒之后,这三个线程就会重新竞争锁,然后依次执行

public class ThreadDemo {public static void main(String[] args) throws InterruptedException {Object locker = new Object();Thread t1 = new Thread(() -> {try {System.out.println("wait 开始");synchronized (locker) {locker.wait();}System.out.println("wait 结束");} catch (InterruptedException e) {e.printStackTrace();}});t1.start();Thread t3 = new Thread(() -> {try {System.out.println("wait3 开始");synchronized (locker) {locker.wait();}System.out.println("wait3 结束");} catch (InterruptedException e) {e.printStackTrace();}});t3.start();Thread.sleep(1000);Thread t2 = new Thread(() -> {synchronized (locker) {System.out.println("notify 开始");locker.notifyAll();System.out.println("notify 结束");}});t2.start();}
}

可见唤醒全部线程,全部执行完毕

四、wait和sleep的对比

wait有一个带参数的版本,用来体现超时时间,就感觉和sleep差不多。

  • 他俩最大的区别就是在于初心不同,wait解决的是线程之间的顺序控制,sleep单纯是让线程休眠一会
  • 另外,wait需要搭配锁使用,sleep不用
http://www.yayakq.cn/news/213588/

相关文章:

  • 网站建设优化扬州咸阳市城乡建设规划局网站
  • 苏州网站开发公司电话wordpress自媒体主题更新失败
  • 个人备案网站做盈利合法吗公式wordpress
  • wordpress网站制作教程视频没有地址如何注册公司
  • 小学网站源码php手机端wordpress怎么用
  • 甘肃省建设厅网站首页网站建设得花多少钱
  • 山西网站建设网站杭州市网站建设公司
  • 南京小程序网站开发东莞seo推广优化排名
  • 什么平台可以做网站无忧seo博客
  • 杭州知名网站建设做医疗的网站建设
  • 火的网站建设明细报价表免费建站网站 百度一下
  • 网站建设申请总结怎样建一个自己公司的网站
  • 太原网站制作在线南宁网站建设
  • 前端设计除了做网站还能做什么建设科技期刊官网
  • php网站后台上传不了图片网上做平面设计的网站
  • 网站建设推广平台网址wordpress怎么编辑网页
  • 跨境电商平台一览表长沙网站搭建seo
  • 华为手机网站建设策划方案论文pc网站还有必要做吗
  • 自学建设网站中山楼市最新消息
  • 350做网站深圳手表网网站
  • wordpress做电影网站创造一个网站
  • pc端微信端网站建设无锡高端网站建设
  • wordpress小图标网站常见的网上购物平台有哪些
  • php做网站图集精准营销推广
  • 做一个中文域名购物网站要多少钱应用网站制作
  • 网站怎么建设好看网页设计图片格式
  • 金融投资管理公司网站源码做3个网站需要多大的服务器
  • 网站开发需求收集手机微信网站模板
  • 爱漫画-只做精品的韩漫网站wordpress 能源插件
  • 网站建设调查报告范文佛山关键词自动排名