`

生产者与消费者(买票和卖票多线程协作)

 
阅读更多

简单模型:

       门票生产者:Production

       门票购买者:Operation

       售票中心:TicketOffice

       门票:Ticket

 

功能说明:

售票中心的门票最大库存10000张,最小库存100张,当大于最大库存时售票中心将不再购买门票,当小于最小库存售票中心则通知门票生产者生产门票并主动运输给售票中心。

 

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

/**
 * 
 * 售票中心
 * 
 * @author ZAKAI
 * 
 */
public class TicketOffice {

	private BlockingQueue<Ticket> queue = new LinkedBlockingQueue<Ticket>();

	/**
	 * 售票最大存货
	 */
	private static final int MAX = 10000;

	private static final int MIN = 100;

	/**
	 * 存入入场票
	 * 
	 * @param t
	 *            门票实体
	 * @throws InterruptedException
	 *             异常实体
	 */
	public void storeTicket(final Ticket t) throws InterruptedException {

		synchronized (this) {
			if (!queue.isEmpty()) {
				while (TicketOffice.MAX < queue.size()) {
					System.out.println("售票中心:存票太多了,暂停进货...目前存票有:"
							+ queue.size() + "张!");
					notify();
					wait();
				}
				System.out.println("售票中心:进货中..目前存票有:" + queue.size() + "张!");
			}
		}
		queue.put(t);
	}

	/**
	 * 卖出入场票
	 * 
	 * @return 门票
	 * @throws InterruptedException
	 *             异常实体
	 */
	public Ticket sellOut() throws InterruptedException {
		synchronized (this) {

			while (queue.isEmpty()) {
				System.out.println("售票中心:票卖完了,等待进货...");
				notify();
				wait();
			}

			// 当库存小于最小库存数量开始开始通知生产者生产
			if (TicketOffice.MIN > queue.size()) {
				System.out.println("售票中心:票的数量低于最小库存了,通知门票生产者送货上门...");
				notify();
			}
		}
		return queue.take();

	}

}

 

 

/**
 * 
 * 门票生产者
 * 
 * @author ZAKAI
 * 
 */
public class Production implements Runnable {

	private static int id = 1;

	private TicketOffice ticketOffice = null;

	public Production(TicketOffice ticketOffice) {
		this.ticketOffice = ticketOffice;
	}

	public void run() {

		for (;;) {

			try {
				ticketOffice.storeTicket(making());

			} catch (InterruptedException e1) {
				e1.printStackTrace();
			}

		}
	}

	private Ticket making() {

		Ticket t = new Ticket(++id);
		System.out.println("门票制造商:已经制造票一张");
		return t;
	}

}

 

 

/**
 * 
 * 门票购买者
 * 
 * @author ZAKAI
 * 
 */
public class Operation implements Runnable {

	/**
	 * 售票中心
	 */
	private TicketOffice ticketOffice = null;

	public Operation(TicketOffice ticketOffice) {
		this.ticketOffice = ticketOffice;
	}

	public void run() {

		for (;;) {
			try {
				buy();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 
	 * 
	 * 到售票中心购买门票
	 * 
	 * @throws InterruptedException
	 */
	public void buy() throws InterruptedException {
		System.out.println(" 门票购买者:买票中...");
		Ticket t = ticketOffice.sellOut();
		System.out.println("门票购买者:" + t + " 票被买到了...");
	}
}

 

 

/**
 * 
 * 门票实体
 * 
 * @author ZAKAI
 * 
 */
public class Ticket {

	/**
	 * 门票标识号
	 */
	private int id;

	public Ticket(int id) {
		this.id = id;
	}

	public String toString() {

		StringBuffer sb = new StringBuffer();

		sb.append("ticket id ").append(id);

		return sb.toString();

	}

}

 

public class Main {

	public static void main(String args[]) {

		final TicketOffice ticketOffice = new TicketOffice();
		
		Thread productionTrd = new Thread(new Production(ticketOffice));
		
		Thread operationTrd = new Thread(new Operation(ticketOffice));
		
		productionTrd.start();
		operationTrd.start();

		
	}
}

 

 

 

分享到:
评论

相关推荐

    多线程java买票系统

    这个文件可能包含了购票操作的核心逻辑,比如定义了一个`SaleTicket`类,它可能包含了一个共享资源(票的数量)和多线程安全的购票方法。购票操作通常需要进行同步控制,防止多个线程同时修改票的数量,导致数据不...

    linux下多线程模拟实验

    生产者-消费者问题是多线程编程中的一个经典案例,主要用于演示如何通过共享内存和线程同步原语来解决数据处理的问题。在这个模型中,"生产者"线程负责生成数据,并将其放入一个有限大小的缓冲区;"消费者"线程则从...

    多线程:4窗口同时买票

    以“4窗口同时买票”为例,如果票的数量有限,可能会出现多个窗口同时卖出同一张票的情况,这就需要引入同步机制。Java中可以使用synchronized关键字、Lock接口(如ReentrantLock)或者Semaphore信号量来实现线程...

    排队买票多线程问题

    模拟三个人排队买票,张某、李某、赵某买电影票、售票员只有3张5元的钱, 电影票5元钱一张。张某拿20元一张的新人民币排在李的钱买票, 李某排在赵的前面拿一张10元的人民币买票,赵某拿一张5元的人民币买票 ...

    java模拟多线程买票问题.docx

    这个问题旨在展示如何在多个线程共享同一资源(如票库存)时确保数据的一致性和正确性。以下是三种不同方法来解决这个问题: 1. **使用`synchronized`关键字**: 在方式1中,我们创建了一个`SaleTicket`类,它实现...

    Java 多线程 订票 示例 线程安全

    在Java编程中,多线程是并发编程的重要组成部分,它允许多个任务同时执行,从而提高应用程序的效率和响应速度。然而,多线程环境下的数据共享和操作可能会引发线程安全问题,如果不正确处理,可能导致数据不一致、...

    java上机报告5——Java的多线程编程1

    该系统模拟了电影院三个售票窗口同时出售电影票的过程,通过 Java 多线程编程实现了多窗口同时出票、随机出票间隔和避免重复出售相同电影票的功能。 一、 Java 多线程编程概念 Java 多线程编程是指在同一个程序中...

    静态代理案例---线程买票

    本案例“静态代理案例---线程买票”是一个典型的多线程应用,通过模拟售票过程,帮助我们理解如何在Java中实现线程同步与通信。 首先,我们来探讨多线程的基本概念。在单核CPU环境下,多线程并不是真正意义上的同时...

    swift NSThread线程同步买票小例子

    在买票的例子中,如果多个线程同时尝试减少票的数量,可能会导致票的数量负数或者不准确。因此,我们需要一种机制来确保同一时间只有一个线程可以修改票的数量。 在Swift中,我们可以使用GCD(Grand Central ...

    操作系统--多线程买票---python--有窗体界面

    操作系统--多线程买票---python--有窗体界面,就是操作系统课上的一个课外练习,传上去,保存下来。 exe文件在 map文件夹--&gt;dict文件夹--&gt;map文件夹--&gt;map.exe 已经打包好了,没有python环境的电脑上也...

    Java多线程Runable售票系统实现过程解析

    生产者负责生产票,消费者负责购买票。在本文的示例代码中,生产者和消费者都是通过线程来实现的。 系统设计 系统设计是售票系统的最后一部分。该部分的主要任务是设计售票系统的架构。在本文的示例代码中,系统...

    linux 买票退票系统

    本文将详细介绍 Linux 多线程实例中的买票退票系统,通过 mutex 互斥锁方式和信号量方式设计实现买票退票系统。 一、mutex 互斥锁方式设计买票退票系统 在 mutex 互斥锁方式设计中,我们使用 pthread_mutex_t 对象...

    车票无忧,快速买票软件

    在技术实现上,"车票无忧"可能采用了多线程和异步处理技术,使得软件能同时处理多个购票请求,提高购票速度。它可能还集成了高速网络连接组件,确保在数据传输过程中保持低延迟,以便在瞬间完成购票操作。此外,软件...

    Java 实现多线程切换等待唤醒交替打印奇偶数

    当某个窗口(线程)在卖某一张票的时候,别的窗口(线程)不允许再卖此张票了,在此过程中涉及到一个锁和资源等待的问题。 如何合理正确的让线程与线程在干同一件事的过程中,不会抢资源以及一个一直等待一个一直...

    Java多线程模拟售票程序和线程安全问题

    Java多线程模拟售票程序和线程安全问题 Java多线程模拟售票程序和线程安全问题是Java编程中一个经典的实践项目,旨在模拟售票系统中多个窗口同时售票的场景。在这个项目中,我们可以学习到Java多线程编程的基本概念...

    Java多线程程序设计

    5. **实现线程互斥与同步**:通过锁机制和`synchronized`关键字来避免多线程环境下的数据竞争问题。 #### 二、实验内容详解 ##### 1. 编写两个线程的程序 首先,我们将编写一个包含两个线程的简单程序。这两个...

    买票找零问题代码

    一场激烈足球赛即将开始,售票员紧张地卖票着……。 每张球票50元,现在有2n(1)个球迷排队购票,其中n个手持50元钞票,另外n个手持100元钞票。假设开始售票时售票处没有零钱可以找零。 问这2n个人有多少种排队方式...

    11085 买票找零

    一场激烈足球赛即将开始,售票员紧张地卖票着……。 每张球票50元,现在有2n(1)个球迷排队购票,其中n个手持50元钞票,另外n个手持100元钞票。假设开始售票时售票处没有零钱可以找零。 问这2n个人有多少种排队方式...

    Ticket_买票系统_ticket_车票管理系统_

    总的来说,"Ticket_买票系统_ticket_车票管理系统_"是一个综合性的IT项目,涉及到数据库设计、前端开发、后端编程、网络通信、安全性等多个领域的知识。通过合理的系统设计和持续优化,可以提供高效、便捷的车票服务...

    电影票 买票系统

    好用的电影买票系统,可以实现清场,并有记忆功能。实现团体购票和个人沟桥。vc++图形界面

Global site tag (gtag.js) - Google Analytics