Java中调用wait方法或者sleep方法都可以让线程进入waitint或者time-waiting状态,但是它们还是

有所不同的:

  1. wait是Object中的方法,而sleep则是Thread中的方法。
  2. sleep可以在任何地方使用,而wait只可以在synchronized方法或synchronized块中使用。
  3. sleep方法只会让出当前线程持有的时间片,而wait方法除了让出时间片还会让出当前线程持有的锁。

  如何证明呢?我设计了如下代码来证明:

 package com.basic.thread;

 /**
* @author zhangxingrui
* @create 2019-02-20 21:37
**/
public class WaitAndSleepDemo { public static void main(String[] args) {
final Object object = new Object(); try {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程A开始");
synchronized (object){
try {
System.out.println("线程A获取到锁");
object.wait(1000);
System.out.println("线程A结束");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start(); Thread.sleep(100); new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程B开始");
synchronized (object){
try {
System.out.println("线程B获取到锁");
Thread.sleep(1000);
System.out.println("线程B结束");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}catch (InterruptedException e){
e.printStackTrace();
}
} }

  输出结果:

  该段代码的原理是先执行线程A,在进入synchonized之后调用wait方法,这个时候线程B也开始执行了;

而如果wait方法会释放锁的话,则B线程可以进入synchonized块中执行,执行完毕后才释放锁给A线程继续执行。

Java线程wait和sleep的区别的更多相关文章

  1. Java线程—-Runnable和Callable的区别和联系

    Java 提供了三种创建线程的方法 1.继承Thread接口 public class Thread2Thread { public static void main(String[] args) { ...

  2. JAVA线程sleep和wait方法区别

    一. sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复,调用sleep 不会释放对象锁.由于没有释放对象锁,所以不能 ...

  3. Java线程Run和Start的区别

    先上结论:run只是Thread里面的一个普通方法,start是启动线程的方法.何以见得呢?可以执行下面的代码看看run和start的区别: package com.basic.thread; /** ...

  4. JAVA线程sleep和wait方法区别 代码

    package test; import java.util.Date; import java.util.Random; public class test { public static void ...

  5. java线程中yield(),sleep(),wait()区别详解

    1.sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁.也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据.注意该方 ...

  6. Java线程中yield与join方法的区别

    长期以来,多线程问题颇为受到面试官的青睐.虽然我个人认为我们当中很少有人能真正获得机会开发复杂的多线程应用(在过去的七年中,我得到了一个机会),但是理解多线程对增加你的信心很有用.之前,我讨论了一个w ...

  7. java 线程同步 原理 sleep和wait区别

    java线程同步的原理java会为每个Object对象分配一个monitor, 当某个对象(实例)的同步方法(synchronized methods)被多个线程调用时,该对象的monitor将负责处 ...

  8. java线程中的sleep和wait区别

                                                                            面试题:java线程中sleep和wait的区别以及其资 ...

  9. JAVA线程池shutdown和shutdownNow的区别

    一.区别介绍 shutDown()  当线程池调用该方法时,线程池的状态则立刻变成SHUTDOWN状态.此时,则不能再往线程池中添加任何任务,否则将会抛出RejectedExecutionExcept ...

随机推荐

  1. MySQL知识总结(二)基本语句总结

    1. 数据库 查看数据库 show databases; 使用数据库 use [数据库名] 如:use mysql 创建数据库 CREATE DATABASE bruce DEFAULT CHARAC ...

  2. DA-GAN技术【简介】【机器通过文字描述创造图像】

    [题外话:今天上课我做了一个关于DA-GAN技术的ppt演讲,写一点东西留念一下...] 转载请注明出处:https://www.cnblogs.com/GraceSkyer/p/9107471.ht ...

  3. R语言常用语法和用法

    数据准备 height <- c(6.00, 5.92, 5.58, 5.92) 1 计算均值 mean(height) [1] 5.855 2 计算中位数 median(height) [1] ...

  4. struts2中的文件上传和下载

    天下大事,必做于细.天下难事,必作于易. 以前见过某些人,基础的知识还不扎实就去学习更难的事,这样必定在学习新的知识会非常迷惑结果 再回来又一次学习一下没有搞懂的知识,这必定会导致学习效率的下降!我写 ...

  5. 【转】Android中获取应用程序(包)的信息-----PackageManager的使用(一)

    转载请注明出处:http://blog.csdn.net/qinjuning       本节内容是如何获取Android系统中应用程序的信息,主要包括packagename.label.icon.占 ...

  6. linux下10款markdown软件

    原文:https://linux.cn/article-7623-1.html 在这篇文章中,我们会点评一些可以在 Linux 上安装使用的最好的 Markdown 编辑器. 你可以在 Linux 平 ...

  7. zoc 下载服务器上数据出现的问题

    zoc上有一个download的按钮能够将服务器上的数据下载下来,但是在下载过程中出现了错误 但是点击会出现下面的问题: 这个配置默认是采用ZMODEM文件传输协议 但是可以看出来,这个传输协议有点问 ...

  8. Mac app打包成dmg

    1. 找到打包的app文件,在Xcode工程的Products目录下 2. 在桌面新建一个文件夹dmg,将app文件放进去. 3. 为了实现拖拽到Application的效果,需要在这个文件夹里放一个 ...

  9. centos 6.8安装java环境

    1.rpm -qa |grep java   查看当前是否有java已经安装了,部分centos系统已经安装了的openjava环境,但是很多项目不熟要求的是要必须是sun的java环境 2.yum ...

  10. C#做一个简单的进行串口通信的上位机

    C#做一个简单的进行串口通信的上位机   1.上位机与下位机 上位机相当于一个软件系统,可以用于接收数据.控制数据.即可以对接收到的数据直接发送操控命令来操作数据.上位机可以接收下位机的信号.下位机是 ...