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. Java 实现对文件系统的监控

    在开发中经常会用到监控文件或是目录的状态,如果你还在手写轮巡扫描文件的话,那你久out了. 1. Commons io为我们提供了一套可靠.高性能的一套文件系统监控API 1.1. 需要的jar包如下 ...

  2. Centos7配置samba

    Centos7配置samba 1.安装 yum install samba samba-client samba-common -y 2.配置 备份已有配置mv /etc/samba/smb.conf ...

  3. springboot整合mybatis将sql打印到日志

    在前台请求数据的时候,sql语句一直都是打印到控制台的,有一个想法就是想让它打印到日志里,该如何做呢? 见下面的mybatis配置文件: <?xml version="1.0" ...

  4. package.xml

    package.xml 也是一个catkin的package必备文件, 它是这个软件包的描述文件, 在较早的ROS版本(rosbuild编译系统)中, 这个文件叫做 manifest.xml , 用于 ...

  5. python开发_stat

    当我们使用os.stat(path)获取一个文件(夹)信息的时候, os.stat(path)本身返回的是一个元组如: nt.stat_result(st_mode=33206, st_ino=203 ...

  6. 关于jquery的click()方法

    昨天,有个同事研究了以下jqury的click()方法,代码如下: <!DOCTYPE html> <html> <head> <meta charset=& ...

  7. CentOS添加并挂载新硬盘

    1.查看当前硬盘使用状况: [test@master Desktop]$ df -hFilesystem Size Used Avail Use% Mounted on/dev/sda2 13G 12 ...

  8. 如何在Windows版本的VMware虚拟机上安装苹果系统

    有时我想玩玩苹果系统,但自己有没有mac,只能在虚拟机上装一个苹果玩玩,但又由于某些原因虚拟机软件VMware不支持安装苹果系统,还在有大佬出于不明目的,在网上散布了适用于Windows版本的VMwa ...

  9. 追溯了解Ubuntu(壹)

    1.关于Ubuntu 安装完成后界面展示 Ubuntu 是一个南非的民族观念,着眼于人们之间的忠诚和联系.该词来自于祖鲁语和科萨语.Ubuntu(发音"oo-BOON-too"-- ...

  10. PHP切割字符用到的explode 以及计数count

    在thinkphp中同样可以用 explode来进行字符的切割工作,比如 $jihe='1,2,3,4'; 在使用explode之后,可以获得一个数组: $array=explode(',',$jih ...