public static native void sleep(long millis)
throws InterruptedException{sleep()是Thread的Static的方法,
因此他不能改变对象锁}
在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),
此操作受到系统计时器和调度程序精度和准确性的影响.该线程不丢失任何监视器的所属权
目的-->不让当前线程独自霸占该进程所获的CPU资源,留时间给其他线程执行的机会public final native void wait(long timeout)
throws InterruptedException{wait()是Object类里的方法}
其他线程调用此对象的notify()或notifyAll()方法,或者超过指定的时间量前,导致当前线程等待。
当前线程必须拥有此对象监视器{必须在synchronized block}
当执行wait()方法,就进入到一个与该对象相关的等待池中,同时释放了对象的锁
sleep 与 wait区别:
sleep()方法休眠,保持对象锁; wait()方法休眠,释放对象锁
public final native void notify(){当前线程必须拥有此对象监视器}
唤醒在此对象监视器上等待的单个线程。如果多个线程都在此对象上等待,则会选择唤醒其中任意一个线程
直到当前线程放弃此对象上的锁定即执行完当前操作,才能继续执行被唤醒的线程
public class ThreadTest {
static byte[] obj = new byte[0];
public static void main(String[] args) throws InterruptedException {
new Thread(new Runnable() {
@Override
public void run() {
synchronized (obj) {
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()
+ "---get lock");
}
}
}).start();
Thread.sleep(100);
new Thread(new Runnable() {
@Override
public void run() {
synchronized (obj) {
obj.notify();
System.out.println(Thread.currentThread().getName()
+ "---execute notify method");
}
System.out.println(Thread.currentThread().getName()
+ "---release lock");
}
}).start();
}
}