Java Thread.wait方法

来源:互联网 发布:查看电脑mac地址命令 编辑:程序博客网 时间:2024/05/22 12:14

Java Thread.wait方法

wait()方法

必须要获得该对象的锁,才能运行,否则会报IllegalMonitorStateException的异常。

try {Object lock = new Object();synchronized (lock) {lock.wait();}} catch (InterruptedException e) {e.printStackTrace();}

进入wait()方法后,会自动放弃获得的对象锁供其他使用。

public class ThreadWait {public static void main(String[] args) {try {Object lock = new Object();new ThreadA(lock).start();Thread.sleep(1000);new ThreadNotify(lock).start();} catch (InterruptedException e) {e.printStackTrace();}}static class ThreadA extends Thread {private Object lock;public ThreadA(Object lock) {this.lock = lock;}public void run() {synchronized (lock) {try {System.out.println("In ThreadA begin at " + System.currentTimeMillis());Thread.sleep(3000);lock.wait();System.out.println("In ThreadA end at " + System.currentTimeMillis());} catch (InterruptedException e) {e.printStackTrace();}}}}static class ThreadNotify extends Thread {private Object lock;public ThreadNotify(Object lock) {this.lock = lock;}public void run() {synchronized (lock) {System.out.println("In ThreadNotify begin at " + System.currentTimeMillis());lock.notify();System.out.println("In ThreadNotify end at " + System.currentTimeMillis());}}}}

线程A在三秒后进入等待状态,并放弃lock的锁。线程Notify在三秒后才能拿到lock的锁,并唤醒线程A。

In ThreadA begin at 1476323856874In ThreadNotify begin at 1476323859875In ThreadNotify end at 1476323859875In ThreadA end at 1476323859875

wait(long)方法

wait()方法会一直等待,直至被唤醒,而wait(long)方法,在指定时间后会进入就绪状态,重新运行。

public class ThreadWait {public static void main(String[] args) {try {Object lock = new Object();new ThreadA(lock).start();Thread.sleep(2000);new ThreadNotify(lock).start();Thread.sleep(1000);new ThreadB(lock).start();} catch (InterruptedException e) {e.printStackTrace();}}static class ThreadA extends Thread {private Object lock;public ThreadA(Object lock) {this.lock = lock;}public void run() {synchronized (lock) {try {System.out.println("In ThreadA begin at " + System.currentTimeMillis());lock.wait(3000);System.out.println("In ThreadA end at " + System.currentTimeMillis());} catch (InterruptedException e) {e.printStackTrace();}}}}static class ThreadB extends Thread {private Object lock;public ThreadB(Object lock) {this.lock = lock;}public void run() {synchronized (lock) {try {System.out.println("In ThreadB begin at " + System.currentTimeMillis());lock.wait(3000);System.out.println("In ThreadB end at " + System.currentTimeMillis());} catch (InterruptedException e) {e.printStackTrace();}}}}static class ThreadNotify extends Thread {private Object lock;public ThreadNotify(Object lock) {this.lock = lock;}public void run() {synchronized (lock) {lock.notify();}}}}

线程A虽然设置了等待3秒,但在2秒后被提前唤醒。而线程B没有被提前唤醒,所以在3秒后自己停止等待。

In ThreadA begin at 1476325715819In ThreadA end at 1476325717820In ThreadB begin at 1476325718820In ThreadB end at 1476325721821


0 0
原创粉丝点击