Thread和Runnable实现线程同步买票

嗯嗯嗯,记录一下自己最近自己又研究了一下关于Thread和Runnable实现线程同步买票

1,实现Runnable接口,重写里面run()方法,比较推荐的一种方式

避免了单继承局限性
增强程序的扩展性,将设置程序线程任务和开启新线程进行了分离


### 使用同步代码块方式

public class RunnableSale implements Runnable {
    private int ticket = 100;
    Object obj = new Object();

    @Override
    public void run() {
        while (true) {
            synchronized (obj){
                if (ticket > 0) {
                    try {
                        Thread.sleep(new Random().nextInt(10));
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    System.out.println(Thread.currentThread().getName()
                            + "=======" + "卖出第" + ticket-- + "张票");
                }
            }

        }

    }
}
### 同步方法方式实现
public class RunnableSale implements Runnable {
    private int ticket = 100;
    Object obj = new Object();

    @Override
    public void run() {
        while (true) {
            sale();
        }

    }

    private void sale() {
        if (ticket > 0) {
            try {
                Thread.sleep(new Random().nextInt(10));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println(Thread.currentThread().getName()
                    + "=======" + "卖出第" + ticket-- + "张票");
        }
    }
}

### 测试
public class SaleFlat{

    public static void main(String[] args) {

        RunnableSale run=new RunnableSale();
        for (int i = 1; i < 5; i++) {
            new Thread(run,i+"号窗口").start();
        }
    }
}

结果
在这里插入图片描述

注意

   private int ticket = 100;

   1,这里ticket为普通的int就可,因为我们在用的使用使用的是同一个RunnableSale对像
   2,同步方法的锁对象是this
使用Thread类实现
### 使用同步代码块实现
public class SaleTicket extends Thread {
    public SaleTicket(String name) {
        super(name);
    }

    private static int ticket = 100;
    String str = "suo";

    @Override
    public void run() {
        while (true) {
            synchronized (str){
                if (ticket > 0) {
                    if (ticket == 50) {
                        try {
                            Thread.sleep(new Random().nextInt(10));
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    System.out.println(this.getName() + "卖出第" + ticket-- + "张票");
                }
            }
        }
    }


}

### 使用同步方法执行

public class SaleTicket extends Thread {
    public SaleTicket(String name) {
        super(name);
    }

    private static int ticket = 100;
    String str = "suo";

    @Override
    public void run() {
        sale();
    }

    private synchronized void sale() {
        while (true) {
            if (ticket > 0) {
                if (ticket == 50) {
                    try {
                        Thread.sleep(new Random().nextInt(10));
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println(this.getName() + "卖出第" + ticket-- + "张票");
            }
        }
    }


}

测试
public class SaleFlat{

    public static void main(String[] args) {

        for (int i = 1; i < 5; i++) {
            SaleTicket t=new SaleTicket(i+"号窗口");
            t.start();
        }

    }

注意

这里同步代码块使用this结果
在这里插入图片描述

private static int ticket = 100;
1,这里必须为static,因为在使用的时候我们是创建了4个对象,所以不会公用这个成员变量
,必须声明静态不然每个窗口单独买100张
2,这里同步方法我用this作锁对象并不可以,我个人认为呢这里锁对象本来是要求必须为同一对象
但是使用这里创建了4个对象,每个this都是不一样的,无法起到同步作用,要是不是这样的
希望前辈们留言告知呀呀呀呀
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值