Object-wait/notify

两个线程用object1作 wait/notify, 是这样:java

thread1 获得object1 的 monitor, 调用 object1.wait() 
  - 释放object1 的 monitor, thread1 wait;

thread2 获得 object1 的 monitor, 调用 object1.notify() 
  - 激活thread1, 释放object1 的 monitor;

thread1 获得 object1 的 monitor, 从object1.wait()返回, thread1接着执行.

举例子:this

public class TestWaitNotify {
    public static void main(String[] args) throws Exception {
        Object object = new Object();
        TestWaitNotify t = new TestWaitNotify();
        new Thread(new TaskWait(object),"thread1").start();
        new Thread(new TaskWait(object),"thread2").start();    }


}

class TaskWait implements Runnable {
    Object object;
    public TaskWait(Object object) {
        this.object = object;
    }
    public void run() {
        try {
            synchronized (object) {
                System.out.println(Thread.currentThread().getName());
               // object.wait();
                Thread.currentThread().sleep(10000);
            }
        }catch (InterruptedException e){

        }
    }
}

输出结果是:
thread1
..等待10s
thread2

若是把object.wait()的注释放开呢?线程

public class TestWaitNotify {
    public static void main(String[] args) throws Exception {
        Object object = new Object();
        TestWaitNotify t = new TestWaitNotify();
        new Thread(new TaskWait(object), "thread1").start();
        new Thread(new TaskWait(object), "thread2").start();
    }


}

class TaskWait implements Runnable {
    Object object;

    public TaskWait(Object object) {
        this.object = object;
    }

    public void run() {
        try {
            synchronized (object) {
                System.out.println(Thread.currentThread().getName());
                object.wait();
                Thread.currentThread().sleep(10000);
            }
        } catch (InterruptedException e) {

        }
    }
}

输出结果是:
thread1
thread2

对比二者,只要调用了wait方法,线程会阻塞,但也放弃了对象锁。code

 

此外,Condition的await方法也是同样的状况对象

public class TestCondition {
    public static void main(String[] args) throws Exception {
        Lock lock = new ReentrantLock();
        Condition condition = lock.newCondition();
        new Thread(new Blockq(lock,condition),"thread1").start();
        new Thread(new Blockq(lock,condition),"thread2").start();

    }
}

class Blockq implements Runnable {
    Lock lock;
    Condition condition;
    public Blockq(Lock lock, Condition condition) {
        this.lock = lock;
        this.condition = condition;
    }

    public void run() {
        lock.lock();
        try {
            System.out.println(Thread.currentThread().getName());
            //condition.await();
            Thread.currentThread().sleep(10000);
        } catch (InterruptedException e) {
        } finally {
            lock.unlock();

        }
    }
}
相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息