同步方法中使用wait(),notify(),notifyAll()

同步方法中使用wait(),notify(),notifyAll()

       wait(),notify(),notifyAll()方法都是Object类中的final方法,被所有类继承,不能重写。当一个线程使用的同步方法中用到某个变量。而次变量需要其它线程修改后才能符合本线程的需要,那么可以在本线程中使用wait()方法。它中断线程的执行,使本线程处于等待状态,让出CPU使用权,并让其它线程使用这个同步方法,其它线程在使用这个同步方法时若不需要等待,那么它使用完这个同步方法后,要用notifyAll()方法通知所有的由于使用该同步方法而处于等待的线程结束等待。层中断的线程就会重新排队等待CPU资源,以便从刚才中断处继续执行这个同步方法。(如果用notify()方法,那么只是通知处于等待状态的线程中的某一个结束等待)

* 三人排队买票,票价5,初始售票员只有一张5.a:20;b:10;C:5

* @author Young

* class TestConmunicate

*/

public class TicketSell {

       int fiveNum = 1,tenNum = 0,twentyNum = 0;

       TicketSell() {

       }

       public synchronized void sellTicket(int receiveMoney){

              if (receiveMoney == 5) {

                     fiveNum += 1;

                     System.out.println(Thread.currentThread().getName()+" 给我5块钱,这是您的入场券\n");

              } else if (receiveMoney == 10){

                     while (fiveNum < 1) {

                            try {

                                   System.out.println(Thread.currentThread().getName()+" 靠边站");

                                   wait();

                                   System.out.println(Thread.currentThread().getName()+" 结束等待");

                            } catch (Exception e) {

                                   e.printStackTrace();

                            }

                     }

                     fiveNum -= 1;

                     tenNum += 1;

                     System.out.println(Thread.currentThread().getName()+" 给我10元钱,找你5,这是你的入场券!");

              }else if (receiveMoney == 20) {

                     while (fiveNum < 1 || tenNum < 1) {

                            try {

                                   System.out.println(Thread.currentThread().getName()+" 靠边站");

                                   //wait();

                                   Thread.currentThread().wait();

                                   System.out.println(Thread.currentThread().getName()+" 结束等待!");

                            } catch (Exception e) {

                                   e.printStackTrace();

                            }

                     }

                     fiveNum -= 1;

                     tenNum -= 1;

                     twentyNum += 1;

                     System.out.println(Thread.currentThread().getName()+" 给我20,找你15,这是你的入场券!");

              }

              notify();

       }

}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值