JAVA——多线程实现卖票

 知识点总结
  1. 实现 Runnable 接口:通过实现 Runnable 接口,一个类可以定义其线程执行的任务。这是创建线程的一种方式,相比直接继承 Thread 类,这种方式更加灵活,因为 Java 只支持单继承。

  2. 线程同步:使用 synchronized 关键字可以创建同步代码块,确保同一时间只有一个线程可以执行该代码块。这是解决多线程访问共享资源时可能出现的竞争条件(race condition)和数据不一致问题的一种常用方法。

  3. 线程休眠Thread.sleep(long millis) 方法使当前线程休眠指定的毫秒数。这可以用于模拟耗时操作,或简单地让出CPU时间片,以便其他线程可以运行。

  4. 异常处理:在多线程编程中,处理可能抛出的异常(如 InterruptedException)是很重要的,以确保程序的健壮性和稳定性。

  5. 共享资源访问:在多线程环境中,访问和修改共享资源(如本例中的 tickets 变量)需要特别小心,以避免数据不一致和竞争条件。

  6. 无限循环:在某些情况下(如服务器或持续运行的任务),使用无限循环是合理的。然而,必须确保有适当的退出机制,以避免资源泄露或程序挂起。

实现代码: 

/**
 * 线程类
 */
public class SellTickets implements Runnable{
    private int tickets = 100; //一共100张特价门票

    @Override
    public void run() {
        while (true){
            //还有没有票
            synchronized (this){//同步语句块可以解决线程安全问题
                if (this.tickets > 0){
                    System.out.println(Thread.currentThread().getName() + "正在出售第 -" + this.tickets +
                            "- 张特价票");
                    //库存变化
                    this.tickets--;
                }

            }
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }
}

 


/**
 * 卖票测试类
 */
public class SellTicketsTest {
    public static void main(String[] args) {
        SellTickets st = new SellTickets();

        Thread window01 = new Thread(st,"文化宫");
        Thread window02 = new Thread(st,"潘家园");
        Thread window03 = new Thread(st,"回龙观");

        window01.start();
        window02.start();
        window03.start();
    }
}

运行:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值