学习时正好碰到这两个方法,就查阅相关资料,并通过程序实现,进行区别一下:

1、每个对象都有一个锁来控制同步访问,Synchronized关键字可以和对象的锁交互,来实现同步方法或同步块。sleep()方法正在执行的线程主动让出CPU(然后CPU就可以去执行其他任务),在sleep指定时间后CPU再回到该线程继续往下执行(注意:sleep方法只让出了CPU,而并不会释放同步资源锁!!!);wait()方法则是指当前线程让自己暂时退让出同步资源锁,以便其他正在等待该资源的线程得到该资源进而运行,只有调用了notify()方法,之前调用wait()的线程才会解除wait状态,可以去参与竞争同步资源锁,进而得到执行。(注意:notify的作用相当于叫醒睡着的人,而并不会给他分配任务,就是说notify只是让之前调用wait的线程有权利重新参与线程的调度);

2、sleep()方法可以在任何地方使用;wait()方法则只能在同步方法或同步块中使用;

3、sleep()是线程线程类(Thread)的方法,调用会暂停此线程指定的时间,但监控依然保持,不会释放对象锁,到时间自动恢复;wait()是Object的方法,调用会放弃对象锁,进入等待队列,待调用notify()/notifyAll()唤醒指定的线程或者所有线程,才会进入锁池,不再次获得对象锁才会进入运行状态;

以程序说明:


  1. public class MultiThread {
  2. private static class Thread1 implements Runnable{
  3. @Override
  4. public void run() {
  5. //由于 Thread1和下面Thread2内部run方法要用同一对象作为监视器,如果用this则Thread1和Threa2的this不是同一对象
  6. //所以用MultiThread.class这个字节码对象,当前虚拟机里引用这个变量时指向的都是同一个对象
  7. synchronized(MultiThread.class){
  8. System.out.println("enter thread1 ...");
  9. System.out.println("thread1 is waiting");
  10. try{
  11. //释放锁有两种方式:(1)程序自然离开监视器的范围,即离开synchronized关键字管辖的代码范围
  12. //(2)在synchronized关键字管辖的代码内部调用监视器对象的wait()方法。这里使用wait方法
  13. MultiThread.class.wait();
  14. }catch(InterruptedException e){
  15. e.printStackTrace();
  16. }
  17. System.out.println("thread1 is going on ...");
  18. System.out.println("thread1 is being over!");
  19. }
  20. }
  21. }
  22. private static class Thread2 implements Runnable{
  23. @Override
  24. public void run() {
  25. //notify方法并不释放锁,即使thread2调用了下面的sleep方法休息10ms,但thread1仍然不会执行
  26. //因为thread2没有释放锁,所以Thread1得不到锁而无法执行
  27. synchronized(MultiThread.class){
  28. System.out.println("enter thread2 ...");
  29. System.out.println("thread2 notify other thread can release wait status ...");
  30. MultiThread.class.notify();
  31. System.out.println("thread2 is sleeping ten millisecond ...");
  32. try{
  33. Thread.sleep(10);
  34. }catch(InterruptedException e){
  35. e.printStackTrace();
  36. }
  37. System.out.println("thread2 is going on ...");
  38. System.out.println("thread2 is being over!");
  39. }
  40. }
  41. }
  42. public static void main(String[] args) {
  43. new Thread(new Thread1()).start();
  44. try{
  45. Thread.sleep(10);
  46. }catch(InterruptedException e){
  47. e.printStackTrace();
  48. }
  49. new Thread(new Thread2()).start();
  50. }
  51. }

程序运行结果如下图所示

小结:

在面试的时候,我们经常会遇到一个问题:sleep()方法与wait()方法区别。二者的作用都是进行等待。区别在于

1、sleep()方法是Thread对象中定义的方法,而wait()方法定义在Object类中

2、可以在任意地方调用线程对象的sleep方法,但是wait()方法必须位于同步代码块或者同步方法中

3、线程在sleep的时候,并不会释放锁,因此其他线程无法获取到锁,因此也无法执行。而wait方法在执行的时候会释放锁,因此其他线程可以获取到锁,可以有机会运行。

Java中sleep()与wait()区别的更多相关文章

  1. java中ArrayList 、LinkList区别

    转自:http://blog.csdn.net/wuchuanpingstone/article/details/6678653 个人建议:以下这篇文章,是从例子说明的方式,解释ArrayList.L ...

  2. java 中 ==和equals 的区别

      Java中equals和==的区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolea ...

  3. java中equals和==的区别 (转)

    java中equals和==的区别  值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中. ==操作比较的是两个变量的值是否相等,对于引 ...

  4. 【转】Java中equals和==的区别

    [转]Java中equals和==的区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boole ...

  5. java中a++与++a区别

    java中a++与++a区别 a++与++a的区别,如果单独使用没有任何区别,如果在运算中就有区别了,a++是先运算在赋值,而++a是先赋值在运算!! 先看a++的代码哦 class demo1 { ...

  6. c#与java中byte字节的区别及转换方法

    原文:c#与java中byte字节的区别及转换方法 在java中  byte的范围在 [-128,127] 在C#中  byte的范围在 [0,255] 所以 java程序与C#程序 进行数据传输的时 ...

  7. java中==与equel的区别

    值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中. ==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地 ...

  8. Java中的“&”和“&&”的区别

    Java中的"&"和"&&"的区别 1."&"是位运算符,"&&"是逻辑 ...

  9. java中PriorityBlockingQueue 和DelayedWorkQueue 区别

    java中PriorityBlockingQueue 和DelayedWorkQueue 区别

  10. Java-杂项: Java中Array和ArrayList区别

    ylbtech-Java-杂项: Java中Array和ArrayList区别 1.返回顶部 1. 1)精辟阐述:可以将 ArrayList想象成一种“会自动扩增容量的Array”. 2)Array( ...

随机推荐

  1. LocationOnScreen-控件在手机屏幕中的位置坐标

    我们可以通过如下的方法获得某个控件在屏幕中的绝对坐标 代码如下: private int[] mHistoryDisplayButtonLocation; private int mHistoryDi ...

  2. python3中让程序暂停运行的语句

    https://blog.csdn.net/zmz971751504/article/details/78288988

  3. 【习题 6-9 UVA - 127】"Accordian" Patience

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 链表模拟即可. 1pile不能加s... [代码] #include <bits/stdc++.h> using nam ...

  4. 很安逸的离线API文档查询工具Dash和Zeal

    大家开发的时候难免会查询一些文档,看一下API的调用方法等,所以会不同的语言去某一个地方去找,确实很麻烦,今天给大家安逸两款软件,肯定会让你爱不释手! Dash for macOS 官方地址:http ...

  5. MySQL字符编码问题,Incorrect string value

    MySQL上插入汉字时报错例如以下.详细见后面分析. Incorrect string value: '\xD0\xC2\xC8A\xBEW' for column 'ctnr' at row 1 M ...

  6. cURL(wget)—— 测试 RESTful 接口及模拟 GET/POST/PUT/DELETE/OPTIONS 请求

    cURL 是一个简单的 http 命令行工具.与最优秀的 Unix 工具一样,在设计之时,cURL 是个小型程序,功能十分专一,而且是故意为之,仅用于访问 http 服务器.(在 Linux 中,可以 ...

  7. docker安装及问题处理

    1.在Ubuntu的命令行中输入 sudo apt-get install docker.io 2.如果切换到了root用户下 apt-get install docker.io 3.对于新安装的Ub ...

  8. jtag引脚

    如果不能下载,可能原因也许是电量不足了... 在电力不足的时候,仿真也不能进行... ///////////////////////////////////////////////////////// ...

  9. 6.5 Android硬件访问服务使用反射

    1.前面的例子中App为了能够范问ILedService接口,把classes.jar导入到应用程序中,但是我们不想把classes编进apk包里面去,这样导致我们的apk程序会很大(解压缩apk会发 ...

  10. eclipse在线安装超级炫酷黑色主题

    Darkest Dark Theme插件: 点击菜单栏 Help --> Eclipse Marketplace,输出Darkest Dark Theme进行搜索,如下图: 本主题有17套编辑器 ...