练习线程,遇到一个小问题

练习题目:写三个线程,一起买100张票!(学习哔站韩顺平老师的讲解线程视频)

售票超卖问题引出的一个线程问题:

在实现售票超卖的时候,我分别用了实现Runnable接口,和继承Thread类,代码如下:

public class SellTicket_01 {
    public static void main(String[] args) {
//        SellTicket_03 sellTicket_03 = new SellTicket_03();
//        new Thread(sellTicket_03).start();
//        new Thread(sellTicket_03).start();
//        new Thread(sellTicket_03).start();

        new SellTicket_00().start();
        new SellTicket_00().start();
        new SellTicket_00().start();
    }
}

class SellTicket_03 implements Runnable{
    private int ticketNum = 10;
    private boolean temp = true;

    public synchronized void sell(){
        if (ticketNum <= 0){
            System.out.println("售票结束……");
            temp = false;
            return;
        }
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("窗口" + Thread.currentThread().getName()
                + "售出一张票"
                + "剩余票数:" + (--ticketNum));
    }

    @Override
    public void run() {
        while (temp){
            sell();
        }
    }
}

class SellTicket_00 extends Thread{
    private static int ticketNum = 10;
    private boolean temp = true;

    public synchronized void sell(){
        if (ticketNum <= 0){
            System.out.println("售票结束……");
            temp = false;
            return;
        }
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("窗口" + Thread.currentThread().getName()
                + "售出一张票"
                + "剩余票数:" + (--ticketNum));
    }

    @Override
    public void run() {
        while (temp){
            sell();
        }
    }
}

问题:继承Thread类后,三个线程买的票都是十张,各买各的,相互不影响

问题的原因如下:

继承Thread类不能实现线程变量资源共享(例如:A类实现了Thread类,A类中的变量不能共享。因为每次new A()都是创建了一个新的线程,每个A类中都有那个变量)

实现Runnable接口,线程变量是可以共享的,但是也可以不共享,主要看线程的创建方式

SellTicket_03 sellTicket_03 = new SellTicket_03();
new Thread(sellTicket_03).start();
new Thread(sellTicket_03).start();
new Thread(sellTicket_03).start();
new Thread(new SellTicket_03()).start();
new Thread(new SellTicket_03()).start();
new Thread(new SellTicket_03()).start();

仔细看,其实很容易发现,主要原因是new的原因,每次new都会创建新的对象,包括对象内面的一切变量方法等,因为他们已经是两个完全不一样的对象了(不一样的对象,怎么可以共享变量呢?就像生活中的我们怎么能让别人替我们吃饭呢?)

新手上路,望各路大神多多指教【拱手】【拱手】【拱手】

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值