sleep与wait方法

Posted zjf6666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sleep与wait方法相关的知识,希望对你有一定的参考价值。

1.wait 属性Object类

技术分享图片

sleep属性 Thread 类

技术分享图片

 

  1. 1. sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep 不会释放对象锁。  
  2. sleep()使当前线程进入阻塞状态,在指定时间内不会执行。  
  3. 2. wait 是Object 类的方法,对此对象调用wait 方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify 方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

首先写个demo  来看public class SleepTest {

public static void main(String[] args) {
ThreadOne one = new ThreadOne();
ThreadTwo two = new ThreadTwo();
one.start();
two.start();
}

}

class ThreadOne extends Thread{
public void run(){
try {

System.out.println("进入了sleep方法当前时间是"+new Date().toLocaleString());
sleep(1000);
System.out.println("sleep方法结束当前时间是"+new Date().toLocaleString());

} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

class ThreadTwo extends Thread{
public void run(){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}

运行结果:

进入了sleep方法

进入了sleep方法当前时间是2018-7-26 11:24:50
sleep方法结束当前时间是2018-7-26 11:24:51

Exception in thread "Thread-1" java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at com.zz.www.Thread.ThreadTwo.run(SleepTest.java:30)

可以看出  sleep方法用法比较简单  但是 wait 方法 必须在synchronized 方法内使用;

修改一下ThreadTwo 

class ThreadTwo extends Thread{

public void run(){
gogo();
}

public synchronized void gogo(){
try {
System.out.println("进入了wait方法 当前时间是"+new Date().toLocaleString());
this.wait(10000);//当前线程等待10000毫秒
System.out.println("wait方法结束 当前时间是"+new Date().toLocaleString());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

再次运行结果为

进入了wait方法 当前时间是2018-7-26 11:25:50
进入了sleep方法当前时间是2018-7-26 11:25:50
sleep方法结束当前时间是2018-7-26 11:25:51
wait方法结束 当前时间是2018-7-26 11:26:00

 

2.  notify(), notifyAll(),wait(), wait(long), wait(long, int)操作,都需要锁对象

例如 :
exapmle 1,锁定方法所属的实例对象:
public synchronized void method(){
    //然后就可以调用:this.notify()...
    //或者直接调用notify()...
}
exapmle 2,锁定方法所属的实例的Class:
public Class Test{
 public static synchronized void method(){
    //然后调用:Test.class.notify()...
 }
}
exapmle 3,锁定其他对象:
public Class Test{
public Object lock = new Object();
 public static void method(){
    synchronized (lock) {
     //需要调用 lock.notify();
    } 
 }
}

 





























































以上是关于sleep与wait方法的主要内容,如果未能解决你的问题,请参考以下文章

wait方法和sleep方法的区别

多线程中的wait与sleep到底谁释放了锁

java中 sleep 与 wait 的区别

sleep与 wait区别

线程中sleep和wait的区别

java中的sleep和wait的区别