博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【原】java 中 sleep(1000) 和 wait(1000) 的区别?
阅读量:5150 次
发布时间:2019-06-13

本文共 2480 字,大约阅读时间需要 8 分钟。

1.首先 sleep 方法是Thread类中的静态方法,他的作用是使当前线程暂时睡眠指定的时间,可以不用放在synchronized方法或者代码块中,但是 wait 方法是Object类的方法,它是使当前线程暂时放弃监视对象的使用权进行等待,必须要放在synchronized方法或者代码块中

2.调用线程的sleep 方法当前线程会让出CPU给其他线程执行,但不会释放锁,依然占用锁的使用权,但是 wait方法会释放锁。

3.sleep方法到睡眠指定时间后会自动回复到可运行状态,但是wait方法需要另外一个拥有锁的对象调用 notify 方法进行唤醒,否则将一直挂起。

 

验证代码如下:

1 package test.main.com; 2  3 public class SleepAndWait { 4      5      6     private static class Thread1 implements Runnable{ 7         @Override 8         public void run() { 9             synchronized (SleepAndWait.class) {10                 System.out.println("thread 1 enter run method...");11                 System.out.println("thread 1 start waiting...");12                 try {13                     SleepAndWait.class.wait();14                 } catch (Exception e) {15                     e.printStackTrace();16                 }17                 System.out.println("thread 1 ending waiting...");18                 System.out.println("thread 1 is over...");19             }20         }21     }22     23     24     private static class Thread2 implements Runnable{25 26         @Override27         public void run() {28             synchronized (SleepAndWait.class) {29                 System.out.println("thread 2 enter run method...");30                 System.out.println("thread 2 sleeping...");31                 SleepAndWait.class.notifyAll();32                 33                 try {34                     Thread.sleep(10000);35                 } catch (InterruptedException e) {36                     e.printStackTrace();37                 }38                  39                 System.out.println("thread2 is going on....");40                 System.out.println("thread2 is over!!!");41             }42         }43         44     }45     46     public static void main(String[] args) {47         new Thread(new Thread1()).start();48         new Thread(new Thread1()).start();49         new Thread(new Thread1()).start();50         51         try {52             System.out.println("main Thread begin sleeping....");53             Thread.sleep(8000);54             System.out.println("main Thread end sleeping....");55         } catch (InterruptedException e) {56             e.printStackTrace();57         }58         59         new Thread(new Thread2()).start();60     }61     62 63 }

 说明:虽然Thread2调用了notify,但是由于Thread2调用的是sleep,所以Thread2实际上还是没有释放锁,因此Thread1的Run方法一直拿不到锁,只有等待Thread2执行完毕以后,Thread1拿到锁,然后才能继续执行。

转载于:https://www.cnblogs.com/tuliang/p/6262043.html

你可能感兴趣的文章
CSS属性值currentColor
查看>>
java可重入锁reentrantlock
查看>>
浅谈卷积神经网络及matlab实现
查看>>
解决ajax请求cors跨域问题
查看>>
《收获,不止Oracle》pdf
查看>>
Real-Time Rendering 笔记
查看>>
如何理解HTML结构的语义化
查看>>
Activity之间的跳转:
查看>>
实验四2
查看>>
多路复用
查看>>
Python数据可视化之Pygal(雷达图)
查看>>
Java学习笔记--字符串和文件IO
查看>>
转 Silverlight开发历程—(画刷与着色之线性渐变画刷)
查看>>
SQL语法(3)
查看>>
在js在添版本号
查看>>
sublime3
查看>>
Exception Type: IntegrityError 数据完整性错误
查看>>
Nuget:Newtonsoft.Json
查看>>
Hdu - 1002 - A + B Problem II
查看>>
Android设置Gmail邮箱
查看>>