notify的唤醒

1 篇文章 0 订阅

1:notify执行后,该线程不会立刻结束,也并没有让出CUP,而是要执行完notify后面的内容后才结束(或者被阻塞,被阻塞时让出了CUP);

2:notify执行后,由于notify是对某一对象上锁,所以该notify只能唤醒同一个锁对象的;非同一锁对象不会被唤醒;

3:被notify唤醒的对象不会被立马执行,而是一个从阻塞状态到等待队列中的过程,一直到notify线程让出CUP后才开始执行;

注意,使用notify或者wait的时候,该方法要加上synchronized锁。

import java.util.concurrent.TimeUnit;

public class notify {
    static Object o = new Object();
    static Object t = new Object();
    /*唤醒用线程a */
    public static class a implements Runnable {
        public void run() {
            synchronized(o){
                System.out.println("a begin");
                try {
                    TimeUnit.MILLISECONDS.sleep(1000);
                } catch (InterruptedException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                System.out.println("a begin notify");
                o.notify();
                try {
                    TimeUnit.MILLISECONDS.sleep(1000);
                } catch (InterruptedException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                System.out.println("a end");
            }
        }
    }
    /*模拟阻塞的线程b 和线程a是同一个o*/
    public static class b implements Runnable{
        @Override
        public void run() {
            synchronized (o) {
                System.out.println("b begin wait");
                try {
                    o.wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                System.out.println("b ok");
            }
        }
    }
    /*模拟阻塞的线程c 和a是不同o*/
    public static class c implements Runnable{
        @Override
        public void run() {
            synchronized (t) {
                System.out.println("c begin wait");
                try {
                    t.wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                System.out.println("c ok");
            }
        }
    }
    
    public static void main(String[] args) {
        Thread A =new Thread(new a());
        Thread B =new Thread(new b());
        B.start();
        try {
			TimeUnit.MILLISECONDS.sleep(100);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        A.start();
    }
}


这样的情况输出为:

b begin wait
a begin
a begin notify
a end
b ok

 

如果将main替换为

    public static void main(String[] args) {
        Thread A =new Thread(new a());
        Thread C =new Thread(new c());
        C.start();
        try {
			TimeUnit.MILLISECONDS.sleep(100);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        A.start();
    }

输出为:

c begin wait
a begin
a begin notify
a end

而且C线程永远不会结束

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值