浅谈Object对象的wait()、notify()方法。

1、为什么wait()、notify()方法要放到Object中,而不是Thread中?

wait()方法:该方法用来使得当前线程进入等待状态,直到接到通知或者被中断打断为止。在调用wait()方法之前,线程必须要获得该对象的对象级锁,否则会抛出IllegalMonitorStateException异常;换句话说就是该方法只能在同步方法或者同步块中调用。调用wait()方法之后,当前线程则释放锁。

notify()方法:该方法用来唤醒处于等待状态获取对象锁的其他线程。如果有多个线程则线程规划器任意选出一个线程进行唤醒,使其去竞争获取对象锁,但线程并不会马上就释放该对象锁,wait()所在的线程也不能马上获取该对象锁,要程序退出同步块或者同步方法之后,当前线程才会释放锁,wait()所在的线程才可以获取该对象锁。

wait()方法是释放锁的;notify()方法不释放锁,必须等到所在线程把代码执行完。

public class Tt {
	public static Object lock = new Object();
	
	public static void main(String[] args) {
		Thread t1 = new Thread(new Runnable(){
			@Override
			public void run() {
				try {
					synchronized (lock) {
						lock.wait();
						System.out.println("t1 synchronized "  + System.nanoTime());
					}
					System.out.println("t1 end "  + System.nanoTime());
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		});
		Thread t2 = new Thread(new Runnable(){
			@Override
			public void run() {
				synchronized (lock) {
					lock.notify();
					System.out.println("t2 end " + System.nanoTime());
				}
			}
		});
		Thread t3 = new Thread(new Runnable(){
			@Override
			public void run() {
				synchronized (lock) {
					System.out.println("t3 end " + System.nanoTime());
				}
			}	
		});
		t1.start();
		t2.start();
		t3.start();
	}
	
}

运行结果如下:

t2 end 6471154195644
t3 end 6471154354939

或者

t2 end 6702284177847
t1 synchronized 6702284358474
t1 end 6702284416098
t3 end 6702284485634
(顺序不定)

分析:

第一种结果:因为线程t2、t3在t1之前竞争到lock对象的锁,t1调用wait,之后程序一直阻塞。

第二种结果:因为线程在t1调用wait方法之后,t2竞争到lock对象的锁,调用notify,t1运行完成。

2、Object对象的wait方法和Thread对象的sleep方法区别?

https://blog.csdn.net/dreamweaver_zhou/article/details/79876805

3、jdk1.5之后的Condition线程之间通信用法?

https://www.cnblogs.com/shijiaqi1066/p/3412346.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值