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();
    } 
 }
}

猜你喜欢

转载自www.cnblogs.com/zjf6666/p/9370915.html