python wait notify_java多线程之wait和notify

多线程中的通信是非常重要的概念,线程直接实现通信就可以并发完成很多复杂工作。

java在Object类中就设计了wait()和notify()两个方法,以解决这个问题。

1.释义:

wait()方法将当前线程暂停,置于“预执行队列”中,而notify()则用于通知一个在wait等待中的线程,可以继续执行了

2.wait()和notify()的使用条件:

wait()和notify()必须置于同步方法和同步代码块中使用,即在调用前,线程必须获得该对象的对象级别锁。否则会抛出异常

3.线程执行到wait()时,直接释放锁,处于等待状态;

public classWaitService {public voidtestMethod(Object lock) {try{synchronized(lock) {

System.out.println("wait begin");

lock.wait();

System.out.println("wait end");

}

}catch(InterruptedException e) {

e.printStackTrace();

}

}

}public class WaitThread1 extendsThread {privateObject lock;publicWaitThread1(Object lock) {this.lock =lock;

}

@Overridepublic voidrun() {

WaitService service= newWaitService();

service.testMethod(lock);

}

}public class WaitThread2 extendsThread {privateObject lock;publicWaitThread2(Object lock) {this.lock =lock;

}

@Overridepublic voidrun() {

WaitService service= newWaitService();

service.testMethod(lock);

}

}public classWaitTest {public static voidmain(String[] args) {

Object lock=newObject();

WaitThread1 t1=newWaitThread1(lock);

WaitThread2 t2= newWaitThread2(lock);

t1.start();

t2.start();

}

}

执行结果:

wait begin

wait begin

4.线程执行notify时,当前线程并不马上释放锁,wait状态的线程也不会马上获得锁,要执行notify方法的程序执行完,退出syncronized代码块后,才释放锁。

public classNotifyService {public voidtestMethod(Object lock){try{synchronized(lock){

System.out.println("wait begin");

lock.wait();

System.out.println("wait end");

}

}catch(InterruptedException e) {

e.printStackTrace();

}

}public voidnotifyMethod(Object lock){try{synchronized(lock) {

System.out.println("begin nofity ");

Thread.sleep(1000);

lock.notify();

System.out.println("end nofity ");

}

}catch(Exception e) {

e.printStackTrace();

}

}

}public class NotifyThreadA extendsThread{privateObject lock;publicNotifyThreadA(Object lock) {this.lock =lock;

}

@Overridepublic voidrun() {

NotifyService service=newNotifyService();

service.testMethod(lock);

}

}public class NotifyThreadB extendsThread {privateObject lock;publicNotifyThreadB(Object lock) {this.lock =lock;

}

@Overridepublic voidrun() {

NotifyService service=newNotifyService();

service.notifyMethod(lock);

}

}public classNotifyTest {public static voidmain(String[] args) {

Object lock=newObject();

NotifyThreadA a= newNotifyThreadA(lock);

a.start();

NotifyThreadB b= newNotifyThreadB(lock);

b.start();

}

}

输出:

wait begin

begin nofity

end nofity

wait end

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值