四个窗口卖票

四个窗口卖票

第一种方法:单线程实现(每个窗口都有100张票互不干扰)

流程图

在这里插入图片描述

代码实现

第一种创建线程方法:继承Thread类,重写run方法
public class WinTicket extends Thread{
    public WinTicket(String name){
        super(name);
    }
    public WinTicket(){
    }
    //票
    private int ticket=100;
    @Override
    public void run() {
        while(true){
            if(ticket<=0){
                break;
            }
            System.out.println(Thread.currentThread().getName()+"卖了第"+ticket+"张票");
            ticket--;
        }
    }
}

测试代码

public class TestWinTicket {
    public static void main(String[] args) {
        //1创建四个窗口
        WinTicket w1=new WinTicket("窗口1");
        WinTicket w2=new WinTicket("窗口2");
        WinTicket w3=new WinTicket("窗口3");
        WinTicket w4=new WinTicket("窗口4");
        //2启动线程
        w1.start();
        w2.start();
        w3.start();
        w4.start();
    }
}
第二种创建线程方法:实现Runnable接口,重写run方法
public class Ticket implements Runnable {
    private int ticket=100;

    @Override
    public void run() {
        while(true){
            if(ticket<=0){
                break;
            }
            System.out.println(Thread.currentThread().getName()+"卖了第"+ticket+"张票");
            ticket--;
        }
    }
}

测试代码

public class TestTicket2 {
    public static void main(String[] args) {
        //创建可运行对象
        Runnable ticket=new Runnable() {
            private int ticket=100;
            @Override
            public void run() {
                while(true){
                    if(ticket<=0){
                        break;
                    }
                    System.out.println(Thread.currentThread().getName()+"卖了第"+ticket+"张票");
                    ticket--;
                }
            }
        };
        //创建线程并启动
        new Thread(ticket,"窗口1").start();
        new Thread(ticket,"窗口2").start();
        new Thread(ticket,"窗口3").start();
        new Thread(ticket,"窗口4").start();

    }
}

第二种方法:多线程实现(四个窗口一共100张票)

流程图

在这里插入图片描述

代码实现

因为四个窗口共同卖100张票,为了防止四个窗口互相抢票,导致同一张票被不同窗口都卖了一次,因此加入了锁,实现只有当一个线程将票卖完以后,才释放资源,下一个线程才会继续卖票。

public class Ticket implements Runnable{
    private  int ticket=100;
    //锁:一般选择共享资源作为锁,多个线程必须使用同一个锁。
    //private Object obj=new Object();
    @Override
    public void run() {
        while(true){
            //同步代码块
            if(!sale()){
                break;
            }
        }
    }
    //非静态方法,锁是this
    //静态方法,锁是 类名.class
    public  synchronized boolean sale(){//this

            if (ticket <= 0) {
                return false;
            }
            System.out.println(Thread.currentThread().getName() + "卖了第" + ticket + "张票");
            ticket--;
            return true;

    }

}

测试代码

public class TestTicket {
    public static void main(String[] args) {
        Ticket ticket=new Ticket();
        new Thread(ticket,"窗口1").start();
        new Thread(ticket,"窗口2").start();
        new Thread(ticket,"窗口3").start();
        new Thread(ticket,"窗口4").start();
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值