`

多线程背课__售票_转转转

    博客分类:
  • java
阅读更多

票真难买呀,咋回个家就怎么难呢? 
  这几天学习了下线程,加上买票的事,就写了个模拟售票窗口买票的问题:有四个窗口对顾客售票,一个顾客只能买一张票.
  1.Consumer类
/**
* 顾客
* @author xpery
*
*/
public class Consumer  implements Runnable {
    private Ticket ticket;
    public Consumer(Ticket ticket){
        this.ticket= ticket;
    }
    public void run() {
        while(true){
            ticket.getConsumer();
            if(ticket.ticketNum<=0){
                System.out.println("售票窗口已关闭,请明天再来!");
                break;
            }
        }
    }
}

2.Windows类
/**
* 窗口
* @author Xpery
*
*/
public class Windows implements Runnable {
    private Ticket ticket;

    public Windows(Ticket ticket){
        this.ticket = ticket;
    }
    public void run() {
        while (true) {
            ticket.saleTicket();
            if(ticket.ticketNum<=0){
                System.out.println("关闭售票窗口"+Thread.currentThread().getName());
                 break;
            }
        }
    }
}

3.Ticket类
import java.util.Vector;

public class Ticket {
    // 总票数
     public  int ticketNum = 100;
    // 是否有顾客
     private boolean isConsumer = false;
    private Vector<Integer> numVector = new Vector<Integer>();

    /**
     * 售票
     */
    public synchronized void saleTicket() {
        // 是否有顾客,没有就等待
        if (!isConsumer) {
            try {
                wait();
            } catch (InterruptedException e1) {
                 e1.printStackTrace();
            }
        }
        if (ticketNum > 0) {
            System.out.println(Thread.currentThread().getName() + "卖给"
                + getConsumerName() + "一张票,票号为:" + ticketNum-- + "票");
        }
        try {
             Thread.sleep(10);
        } catch (InterruptedException e) {
             e.printStackTrace();
        }
        isConsumer = false;
        notify();
    }
    /**
     * 获取顾客
      */
    public synchronized void getConsumer() {
        // 是否有顾客,有就等待
        if (isConsumer) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        // 判断票是否已经售完
         if(ticketNum==0){
            System.out.println("对不起,今天的票已售完,请明天早点来!");
        }
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        isConsumer = true;
        notify();
        }
    /**
     * 获取顾客名称
      * @return
     */
    public String getConsumerName() {
        int num = Integer.valueOf((int)(Math.random() * 999 + 1));
        String consumerName="顾客" + num;
        // 判断是否有人重复买票
         while (numVector.contains(num)) {
            System.out.println("对不起,"+consumerName+" ,您已经买了一张票,不能再买一张了");
            num = Integer.valueOf((int)(Math.random() * 999 + 1));
        }
        numVector.add(num);
        return consumerName;
    }
}
4.主程序:MianTest
public class MianTest {

    public static void main(String[] args) {
        Ticket ticket = new Ticket();

       /**
        * 产生一个顾客对象,用来获取顾客
         */
        Consumer consumer = new Consumer(ticket);
        Thread threadConsumer = new Thread(consumer);
        threadConsumer.start();

       /**
        * 产生四个窗口
         */
        Windows windows = new Windows(ticket);
        for (int i = 1; i < 5; i++) {
            Thread threadWindows = new Thread(windows);
            threadWindows.setName(i + "号窗口");
            threadWindows.start();
        }
    }
}

分享到:
评论

相关推荐

    Java Thread多线程全面解析

    Java Thread多线程全面解析涵盖了Java编程中关于线程的重要概念和实践技巧。在Java中,多线程是并发编程的基础,允许程序同时执行多个任务,提高系统资源利用率和应用程序的响应速度。 线程的生命周期包括五个基本...

    影院售票系统

    6. **多线程处理**:在高并发的售票场景下,多线程处理是提高系统性能的重要手段。学习线程的创建、同步和互斥锁等概念,可以保证系统在处理购票请求时的稳定性和效率。 7. **Web服务或API调用**:如果系统需要与...

    计算器&矩阵&售票系统源码

    12. **并发与多线程**:如果售票系统需要支持多用户同时操作,那么必须处理并发和线程同步问题,以防止数据冲突。 13. **安全性**:考虑到涉及金钱交易,系统应有相应的安全措施,如防止SQL注入、数据加密等。 ...

    电影售票系统

    6. **多线程**:如果系统支持并发购票,那么多线程编程就显得尤为重要。Java的Thread类和Runnable接口可以实现多线程,保证系统的高效运行。 7. **设计模式**:在编写大型程序时,设计模式提供了一种标准的解决方案...

    北大青鸟5.0 C# 影院售票系统

    7. **多线程**:如果系统需要处理并发的售票请求,可能需要用到多线程技术,确保同时处理多个销售任务,提高系统性能。 8. **状态管理**:在售票系统中,可能会有“待支付”、“已支付”等订单状态,需要设计合理的...

    MulThread.zip_multhread

    9. **TicketsSystem.java**:这个文件很可能是一个模拟售票系统的例子,通常会展示如何在多线程环境下正确处理共享资源,如票的数量。它可能涉及到线程同步机制,如synchronized或Lock,以确保在并发环境下售票的...

    航空售票C++ JAVA版

    3. **多线程**:并发处理购票请求,提高系统响应速度。使用Thread或Runnable接口实现并发。 4. **网络通信**:如果系统涉及服务器与客户端之间的通信,可能需要使用Socket编程,实现数据的发送和接收。 5. **IO与...

    多核与并发数据结构-用于列车售票的可线性化并发数据结构.zip

    并发数据结构是为多线程环境设计的数据结构,它们在多个线程访问时能够保持一致性,避免出现数据不一致的情况。可线性化是并发数据结构的一种关键特性,它保证了在不同的并发执行历史中,数据结构的状态转换看起来像...

    RMI售票管理-java

    为了实现这些功能,开发者可能使用了Java的多线程来处理并发请求,确保系统在高负载下的稳定运行。同时,为了保证数据的一致性,可能还应用了事务管理,比如ACID(原子性、一致性、隔离性和持久性)原则。 此外,...

    操作系统概念课后答案

    6. **并行与分布式系统**:介绍并发编程的挑战、线程和进程间的协作,以及分布式系统的原理和通信机制。 7. **调度算法**:学习不同的进程调度策略,如FCFS(先来先服务)、SJF(最短作业优先)、优先级调度和多级...

    Java优化策略在铁路互联网售票系统中的应用研究.zip

    再者,多线程并行处理是大型系统性能提升的关键。Java提供了丰富的并发工具类,如ExecutorService、Semaphore、CyclicBarrier等,用于高效地管理线程池和控制并发。在铁路售票系统中,合理使用这些工具可以有效地...

    java集合、IO、多线程、网络编程、DAO设计模式45道练习题。敢接吗!

    #### 三、多线程编程 **题目15**: 有500张火车票编号从001到500,5个窗口同时售票,请写出一个类,实现5个窗口可同时售票。 **解析**: 这个问题可以通过使用`Thread`类和`synchronized`关键字来实现线程间的同步,...

    发卡源码java-La-gestion-du-multithread:来自Video2Brain的培训“Java:多线程管理”的源代码

    【描述】"发卡源码java"可能是指这个项目包含了一些与处理并发任务相关的代码,如模拟售票或发卡等场景,这些场景通常需要多线程来提高效率。通过这个项目,开发者可以学习到如何在Java平台上实现并发编程。 【标签...

    操作系统实验说明

    实验可能涉及使用特定的编程语言(如C或Python)编写并发程序,模拟多线程或多进程环境,以体验同步与互斥的概念,比如信号量机制和死锁的预防与检测。 接着,我们会探索内存管理。在这一部分,你将了解到虚拟内存...

    最新操作系统试题及答案

    5. Windows NT是微内核结构的操作系统,进程不再是执行的单位,而是资源分配的单位,线程完成执行功能。 解答题: 1. 操作系统是管理和控制计算机硬件与软件资源的系统软件,它为用户和其他软件提供服务,如资源...

    安卓Android汽车票售票订票app设计可导入Studio毕业源码案例设计.zip

    本资源是一个针对安卓Android平台的汽车票售票订票应用的毕业设计案例,包含了完整的源...通过研究源代码,可以提升对Android开发技术的理解,包括UI设计、网络通信、数据库操作、多线程处理以及第三方服务的集成等。

    深入.NET平台

    5. **多线程**:在高并发环境下,如多个用户同时购票,多线程技术可以确保系统的稳定性和性能,避免数据冲突。 6. **缓存管理**:为了提高性能,可能使用缓存技术(如Redis或Memory Cache)来存储热门或频繁访问的...

    2018年C++教程网的linux网络编程视频共41集百度云下载链接.rar

    处理多客户连接(process-per-conection) 点对点聊天程序实现 09socket编程(四) 流协议与粘包 粘包产生的原因 粘包处理方案 readn writen 回射客户/服务器 10socket编程(五) read、write与recv、send readline...

    进程同步模拟程序

    进程同步是操作系统中一个至关重要的概念,特别是在多处理器和多线程环境中,多个进程或线程可能同时访问共享资源,这就需要有效地管理它们的执行顺序,以防止数据不一致和死锁的发生。在这个"进程同步模拟程序"中,...

Global site tag (gtag.js) - Google Analytics