多线程之等待通知机制

闲话少说,直接上代码:

package com.ilucky.test.jdk.util.concurrent;

import java.util.Date;

/**
 * 等待/通知机制.
 * 等待/通知机制,是指一个线程A调用了对象O的wait()方法进入等待状态,而另一个线程B调用了O对象的notify()
 * 或者notifyAll()方法, 线程A收到通知后从对象O的wait()方法返回,进而执行后面的操作。
 * 两个线程通过对象O来完成交互, 而对象上的wait和notify/notifyAll方法如同开关信号一样。
 * 用来完成等待方和通知方之间的交互工作。
 * 
 * 注意: 
 * 1. wait, notify和notifyAll方法调用前,需要先对对象加锁。
 * 2. wait方法调用后,会释放锁。
 * 3. notify和notifyAll方法调动后,不会立刻从wait方法返回,还需要释放锁。
 * 4. wait方法调用后,线程状态由Running状态变为waitting状态, 并将当前线程放到对象的等待队列。
 * 5. notify和notifyAll方法调用后,将等待队列中的一个(或者全部)线程从等待队列中移动到同步队列中。
 * 
 * 另外,需要注意: 等待/通知机制依赖于同步机制。
 * @author IluckySi
 *
 */
public class WaitNotifyTest {

    public static void main(String[] args) {
        Object lock = new Object();
        new WaitThread(lock).start();
        try {
            System.out.println("---------等待线程执行完成2秒后,再执行通知线程--------");
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        new NotifyThread(lock).start();
    }
}

class WaitThread extends Thread {

    private Object lock;

    WaitThread(Object lock) {
        this.lock = lock;
    }

    public void run() {
        System.out.println(new Date() + "-----------【进入等待线程】---------");
        synchronized(lock) {
            try {
                lock.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(new Date() + "------------等的花儿都谢了...[开始执行业务逻辑了]");
        }
    }
}

class NotifyThread extends Thread {

    private Object lock;

    NotifyThread(Object lock) {
        this.lock = lock;
    }

    public void run() {
        System.out.println(new Date() + "-----------【进入通知线程】---------");
        synchronized(lock) {
            lock.notify();
            try {
                System.out.println(new Date() + "---------通知完睡5秒--------");
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        System.out.println(new Date() + "---------睡完5秒继续加锁--------");
        synchronized(lock) {
            System.out.println(new Date() + "---------这次我就自己玩了,不通知别人了--------");
        }
    }
}
/**
注意观察时间:
---------等待线程执行完成2秒后,再执行通知线程--------
Wed May 24 12:15:37 GMT+08:00 2017-----------【进入等待线程】---------
Wed May 24 12:15:39 GMT+08:00 2017-----------【进入通知线程】---------
Wed May 24 12:15:39 GMT+08:00 2017---------通知完睡5秒--------
Wed May 24 12:15:44 GMT+08:00 2017---------睡完5秒继续加锁--------
Wed May 24 12:15:44 GMT+08:00 2017---------这次我就自己玩了,不通知别人了--------
Wed May 24 12:15:44 GMT+08:00 2017------------等的花儿都谢了...[开始执行业务逻辑了]
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值