sleep( ) 和 wait( ) 的这 5 个区别,你知道几个

转载自  sleep( ) 和 wait( ) 的这 5 个区别,你知道几个

sleep(休眠) 和 wait(等待) 方法是 Java 多线程中常用的两个方法,它们有什么区别及一些该注意的地方有哪些呢?下面给大家一一分解。

区别1:使用限制

使用 sleep 方法可以让让当前线程休眠,时间一到当前线程继续往下执行,在任何地方都能使用,但需要捕获 InterruptedException 异常。

try {Thread.sleep(3000L);
} catch (InterruptedException e) {e.printStackTrace();
}

而使用 wait 方法则必须放在 synchronized 块里面,同样需要捕获 InterruptedException 异常,并且需要获取对象的锁。

synchronized (lock){try {lock.wait();} catch (InterruptedException e) {e.printStackTrace();}
}

而且 wait 还需要额外的方法 notify/ notifyAll 进行唤醒,它们同样需要放在 synchronized 块里面,且获取对象的锁。。

synchronized (lock) {// 随机唤醒lock.notify();// 唤醒全部lock.notifyAll();
}

当然也可以使用带时间的 wait(long millis) 方法,时间一到,无需其他线程唤醒,也会重新竞争获取对象的锁继续执行。

区别2:使用场景

sleep 一般用于当前线程休眠,或者轮循暂停操作,wait 则多用于多线程之间的通信。

区别3:所属类

sleep 是 Thread 类的静态本地方法,wait 则是 Object 类的本地方法。

java.lang.Thread#sleep

public static native void sleep(long millis) throws InterruptedException;

java.lang.Object#wait

public final native void wait(long timeout) throws InterruptedException;

为什么要这样设计呢?

因为 sleep 是让当前线程休眠,不涉及到对象类,也不需要获得对象的锁,所以是线程类的方法。wait 是让获得对象锁的线程实现等待,前提是要楚获得对象的锁,所以是类的方法。

区别4:释放锁

Object lock = new Object();
synchronized (lock) {try {lock.wait(3000L);Thread.sleep(2000L);} catch (InterruptedException e) {e.printStackTrace();}
}

如上代码所示,wait 可以释放当前线程对 lock 对象锁的持有,而 sleep 则不会。

区别5:线程切换

sleep 会让出 CPU 执行时间且强制上下文切换,而 wait 则不一定,wait 后可能还是有机会重新竞争到锁继续执行的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/325735.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis_1 简介

1、什么是框架?它是我们软件开发中的一套解决方案,不同的框架解决的是不同的问题使用框架的好处:框架封装了很多的细节,使开发者可以使用极简的方式实现功能。大大提高开发效率。 2、三层架构 表现层:是用于展示数据的…

使用java读取文件并输出

通过Reader读取文件中的内容: 下面是文件: test.txt: 1、看着街上的人群,各个都把自己捂得严严实实的,好似一个个奇怪的布包裹。窗外的天,是灰蒙蒙的一片,灰色的霾把所有的物体都笼罩了起来。2、它来时&am…

Akka系列---什么是Actor

本文已.Net语法为主,同时写有Scala及Java实现代码 严肃的说,演员是一个广泛的概念,作为外行人我对Actor 模型的定义: Actor是一个系统中参与者的虚拟人物,Actor与Actor之间是可以相互沟通,所有的沟通都是通过Message 比如说一个呼叫中心,数以百万计的客户可能会呼叫一个1-800的…

架构师的工作都干些什么?!想做架构师必看

转载自 架构师的工作都干些什么?!想做架构师必看 之前有网友说想看架构师升级的文章,所以写了本文。先给本文中架构师做个定义:第一,能力上达到(似乎是废话),第二,公司…

使用java将字符串写入到指定的文件中

指定的字符串: 白天走在街道上,伸手不见五指,周围的建筑全被雾笼罩了,在家里通过窗户往外望去,外面就像仙境一般,雾把所有的东西都淹没了,能看到的,只有白色的雾。!文件…

Mybatis入门 使用XML

1、项目结构 2、详细代码 数据库: 1、创建实体类bean package com.itheima.domain;import java.io.Serializable; import java.util.Date;/*** Created by Administrator on 2019/10/11.*/ public class User implements Serializable {private Integer id;priv…

.NET的一点历史故事:擦肩而过的机遇

Sun 公司曾经借由 SunOS/Solaris 这个 UNIX 操作系统,SPARC 硬件平台和 Java 语言建立了一个商业帝国。Sun 工作站应该是很多资深业界大佬们偶尔还会拿来回忆的一个经典产品。不过时间进入二十一世纪第一个十年的中段,它已经在竞争对手的轮番进攻下显出了…

响应式布局

一、实现弹性布局的方法: 1.浮动百分比 好处:网页内容宽度自适应 多设备都适用 2.flex弹性盒模型:该模型决定一个盒子在其他盒子中的分布方式以及如何处理可用空间。 二、Flex布局的功能: 1.在屏幕和浏览器窗口大小发生改变时&am…

Java 中的 String 真的是不可变的吗

转载自 Java 中的 String 真的是不可变的吗 我们都知道 Java 中的 String 类的设计是不可变的&#xff0c;来看下 String 类的源码。 public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence {/** The value is used for char…

JS中变量的作用域

/** 作用域* - 作用域指一个变量的作用的范围* - 在JS中一共有两种作用域&#xff1a;* 1.全局作用域* - 直接编写在script标签中的JS代码&#xff0c;都在全局作用域* - 全局作用域在页面打开时创建&#xff0c;在页面关闭时销毁* - 在全局作用域中有一个全局对象…

Mybatis入门 使用注解

使用XML方式地址为Mybatis入门 使用XML 1、目录结构 2、需要修改的地方 1、mybatis的配置文件 <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.…

浅析如何在Nancy中生成API文档

前言 前后端分离&#xff0c;或许是现如今最为流行开发方式&#xff0c;包括UWP、Android和IOS这样的手机客户端都是需要调用后台的API来进行数据的交互。 但是这样对前端开发和APP开发就会面临这样一个问题&#xff1a;如何知道每个API做什么&#xff1f; 可能&#xff0c;…

bootstrap样式

一、目前比较主流的前端框架有&#xff1a; 1.layui 2.vue.js 3.bootstrap 4.jquery ui 二、bootstrap&#xff1a; 1.来自Twitter,目前最流行的前端框架之一 2.是基于HTML、CSS和JavaScript的一个简洁、灵活的开源框架。 3.目前版本是V3 三、bootstrap的优势&#xff1a; 1.快…

JS中的this指向问题

this&#xff08;上下文对象&#xff09; 我们每次调用函数时&#xff0c;解析器都会将一个上下文对象作为隐含的参数传递进函数。 使用this来引用上下文对象&#xff0c;根据函数的调用形式不同&#xff0c;this的值也不同。 指向当前对象 this的不同的情况&#xff1a; 1.…

一文告诉你如何导出 Git 变更文件

转载自 一文告诉你如何导出 Git 变更文件 有时候我们想导出某次版本提交时有哪些变更的文件&#xff0c;在 svn 中有一个 export 功能&#xff0c;很方便&#xff0c;如下图所示。 在 Git 中我也找到了以下两种方法。 方法1 使用 git 自带命令 git archive, 语法如下。 g…

模糊查询

模糊查询是针对字符串操作的&#xff0c;类似正则表达式&#xff0c;没有正则表达式强大通配符&#xff1a;_ 、% 、[] 、_ 表示任意的单个字符--查询MyStudent表中任意姓张&#xff0c;名字两个字的姓名 select * from MyStudent where fname like 张_ --查询MyStudent表中任意…

Entity Framework Core的贴心:优雅处理带默认值的数据库字段

对于用于保存记录添加时间的数据库日期字段&#xff0c;我们通常会设置一个 GETDATE() 的默认值&#xff0c;而不是在应用程序的代码中获取当前时间进行保存&#xff0c;这样可以避免由于web服务器时钟不同步引起的时间偏差。 Entity Framework Core 在设计时贴心地考虑到这个…

bootstrap组件

一、Bootstrap常用的组件&#xff1a; icon图标&#xff0c;下拉菜单&#xff0c;导航&#xff0c;导航条&#xff0c;输入框&#xff0c;缩略图&#xff0c;媒体对象&#xff0c;列表组&#xff0c;分页导航。 二、小图标&#xff1a; 1.bootstrap中内置提供了250多种小图标。…

JS中使用工厂模式创建对象

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <script>function createPerson(name , age ,gender){//创建一个新的对象var obj new Object…

深度历险:Redis 内存模型详解

转载自 深度历险&#xff1a;Redis 内存模型详解 Redis 是目前最火爆的内存数据库之一&#xff0c;通过在内存中读写数据&#xff0c;大大提高了读写速度&#xff0c;可以说 Redis 是实现网站高并发不可或缺的一部分。 我们使用 Redis 时&#xff0c;会接触 Redis 的 5 种对…