Java_线程—经典的例子:售票

在多线程中,有一个经典的例子:售票

售票很常见,公园,车站,电影院,都有售票系统,通常这些售票的地方,都开放着不止一个售票窗口。这就涉及到了多线程的概念了。

接下来看看这个例子:

既然线程有两种方式,我们就分别看看这两种方式写出来的程序和运行之后的结果是咋样的?

先来看看继承Thread的方式:

线程类:


运行及其结果:



先别管怎么样,先来看看Runnable方式实现出来的是咋样的?

Runnable方式:

Runnable类:


运行及其结果:



现在先来看看两种方式得到的结果,总票数同样是5张,也同样是开两个线程去售票。

看第一种继承Thread类的方式,打印出来总共有10条数据,也就是说,两个线程分别售票,互不相关。一张票被售出了两次。

而第二种方式:打印出来总共有5条数据,两个线程同时售票,总共售出5张票,也就是说两个线程同时首同一个票池内的票。一张票只售一次。

结果看完了,很明显,第二种方式才是我们想要的,第一种明显不符合,一张票被售了两次,想想,如果一辆班车上的一个座位的一张票被卖了两次,上车的时候来了两个人,会咋样?很可怕。对吧。

所以,也就可以得到我们上一节里面说的,实现Runnable方式,可以实现数据的共享。也提高了代码的健壮性。


<偷偷的告诉你们,当你把Thread类中的票的总数定义为静态(static)的时候,也是可以实现的,嘿嘿>


线程篇:

Java_线程-Thread

Java_线程—经典的例子:售票

Java_线程—经典的例子:生产者和消费者


java_多线程下载


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java线程模拟售票程序可以通过实现Runnable接口或继承Thread类来实现。这两种方式都可以达到多线程的效果。在实现Runnable接口的情况下,可以创建一个实现了Runnable接口的类,并在该类中重写run()方法。然后,通过创建多个线程对象,并将该实现类的对象作为参数传入Thread的构造函数中,然后调用start()方法启动线程。在实现Thread类的情况下,可以直接创建继承Thread类的子类,并在子类中重写run()方法。然后,通过创建多个子类对象,调用start()方法启动线程。 下面是一个使用实现Runnable接口的例子: ``` public class TicketSalesByRunnable { public static void main(String[] args) { SellTicket02 sellTicket02 = new SellTicket02(); new Thread(sellTicket02).start(); new Thread(sellTicket02).start(); new Thread(sellTicket02).start(); } } class SellTicket02 implements Runnable { private int ticketNum = 100; @Override public void run() { while (true) { if (ticketNum <= 0) { System.out.println("没有余!"); break; } try { Thread.sleep(50); } catch (InterruptedException e) { throw new RuntimeException(e); } System.out.println("窗口" + Thread.currentThread().getName() + "售出一张。" + "剩余数:" + (--ticketNum)); } } } ``` 下面是一个使用继承Thread类的例子: ``` public class TicketSalesByThread { public static void main(String[] args) { SellTicket sellTicket = new SellTicket(); SellTicket sellTicket1 = new SellTicket(); SellTicket sellTicket2 = new SellTicket(); sellTicket.start(); sellTicket1.start(); sellTicket2.start(); } } class SellTicket extends Thread { private static int ticketNum = 100; @Override public void run() { while (true) { if (ticketNum <= 0) { System.out.println("没有余!"); break; } try { Thread.sleep(50); } catch (InterruptedException e) { throw new RuntimeException(e); } System.out.println("窗口" + Thread.currentThread().getName() + "售出一张。" + "剩余数:" + (--ticketNum)); } } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值