在线程同步方法中使用wait(),notify()和notifyAll()方法

1.当一个线程使用的同步方法中用到某个变量,而此变量又需要其他线程修改后才能符合本线程需要,那么可以在同步方法中使用wait()方法。
2.wait方法可以中断方法的执行,使本线程等待,暂时让出CPU的使用权,并允许其他线程使用这个同步方法。
其他线程如果在使用这个同步方法时不需要等待,那么它使用完这个同步方法的通知,应当用notify()方法通知所有的由于使用这个同步方法而处于等待的线程结束等待。
3.曾中断的线程就会从刚才的中断处继续执行这个同步方法,并遵循先中断先继续得原则。
4.如果使用notify()方法,那么只是通知处于等待中的线程的某一个结束等待
5.wait(),notify()和notifyAll()都是object类中的final方法,被所有的类继承,且不允许重写的方法。

张飞和李逵买电影票,售票员只有两张五元的钱,电影票五元钱一张。张飞拿二十元一张的人民币排在李逵的前面买票,李逵拿一张五元的人民币买票。因此张飞必须等待(还是李逵先买了票)
在这里插入图片描述

public class wait_notify_notifyAll {
    public static void main(String args[]){
        TicketHouse officer = new TicketHouse();
        Thread zhangfei,likui;
        zhangfei = new Thread(officer);
        zhangfei.setName("张飞");
        likui = new Thread(officer);
        likui.setName("李逵");
        zhangfei.start();
        likui.start();
    }
}

class TicketHouse implements Runnable{

    int fiveAmount = 2,tenAmount = 0,twentyAmount = 0;
    @Override
    public void run() {
        if(Thread.currentThread().getName().equals("张飞")){
            saleTicket(20);
        }else if(Thread.currentThread().getName().equals("李逵")){
            saleTicket(5);
        }
    }

    private synchronized void saleTicket(int money){
        if(money==5){//如果使用该方法的线程传递的参数是5,就不用等待
            fiveAmount = fiveAmount+1;
            System.out.println("给"+Thread.currentThread().getName()+"入场券,"+Thread.currentThread().getName()+"的钱正好");
        }else if(money==20){
            while (fiveAmount<3){
                try{
                    System.out.println("\n"+Thread.currentThread().getName()+"靠边等待");
                    wait();//如果使用该方法的线程传递的参数是20须等待
                    System.out.println("\n"+Thread.currentThread().getName()+"继续买票");
                }catch (Exception e){

                }
            }
            fiveAmount = fiveAmount -3;
            twentyAmount = twentyAmount+1;
            System.out.println("给"+Thread.currentThread().getName()+"入场券,"+Thread.currentThread().getName()+"给20,找零15元");
        }
        notifyAll();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值