并发编程(6)Object类对线程的操作(wait/notify/notifyAll)

Java Object 类也提供了线程操作的方法,下面我们来了解一下

.1)wait

wait()方法为Object类的方法,主要用于线程间通信,调用wait()方法的时候,线程会放弃对象锁(sleep 不会放弃对象锁),进入等待此对象的等待锁定池,只有针对此对象调用notify()方法(或notifyAll())后本线程才进入对象锁定。

注:如果调用某个对象的wait()方法,当前线程必须拥有这个对象的monitor(即锁),因此调用wait()方法必须在同步块或者同步方法中进行(synchronized块或者synchronized方法),因为wait方法放弃了对象锁,所以同步代码块可以被访问。

public class TestWait {
	
	private Object obj=new Object();
	
	class WaitTread1 extends Thread{

		@Override
		public void run() {
			System.out.println(Thread.currentThread().getName()+":begin");
			synchronized(obj){
				try {
					obj.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			System.out.println(Thread.currentThread().getName()+":end");
		}
	}
	
	class WaitThread2 extends Thread{

		@Override
		public void run() {
			System.out.println(Thread.currentThread().getName()+":begin");
			synchronized (obj) {
				obj.notify();
			}
			System.out.println(Thread.currentThread().getName()+":end");
		}
		
	}
	
	public static void main(String[] args) {
		TestWait tw=new TestWait();
		WaitTread1 wt1=tw.new WaitTread1();
		WaitThread2 wt2=tw.new WaitThread2();
		wt1.start();
		wt2.start();
		
	}

}
执行结果:

Thread-0:begin
Thread-1:begin
Thread-1:end
Thread-0:end

由结果我们可以看出,线程Thread-0在调用wait()方法后,Thread-1访问了obj对象,说明Thread-0放弃了obj的对象锁,同时Thread-0是在Thread-1执行notify()方法后被唤醒的。

.2)notify notifyAll

notify()和notifyAll()方法也同样是Object类的方法,notify()方法能够唤醒一个正在等待该对象锁的线程,当有多个线程都在等待该对象的锁的话,则只能唤醒其中一个线程,具体唤醒哪个线程则不得而知,nofityAll()方法能够唤醒所有正在等待该对象的锁的线程。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值