`
bcworld
  • 浏览: 39511 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

java 线程 模拟卖票

 
阅读更多

 

package thread;
import javax.swing.JFrame;

public class Buy extends JFrame{
	static SalesLady lady=new SalesLady(19,0,0);
	
	public static void main(String []args){
	int money[]={10,10,5,10,5,10,5,5,10,5,10,5,5,10,5};
	Thread thread[]=new Thread[20];
	System.out.println("现在开始售票。。。");
	for(int i=0;i<money.length;i++){
		//创建money.length个顾客线程
		thread[i]=new Thread(new Customer(i+1,money[i]));
		//顾客开始买东西
		thread[i].start();
	}
	//检查是否所有顾客都已买完东西
	/*WhileLoop usage:*/
	 whileLoopFlag:
		while(true){
			for(int i=0;i<money.length;i++){
				if(thread[i].isAlive()){
					continue   whileLoopFlag;
				}
			}
			break;
		}
		
	System.out.println("售票结束了。");
	}
}
/**
 * 售货员
 * @author Administrator
 *
 */
class SalesLady{
	
	int items;//商品数量
	int fiveNum;//5角数量
	int tenNum;//1元数量
	private String response="";
	/**
	 * 创建售货员
	 * @param items 商品数量
	 * @param fiveNum 5角数量
	 * @param tenNum 1元数量
	 */
	public SalesLady(int items,int fiveNum,int tenNum){
		this.items=items;
		this.fiveNum=fiveNum;
		this.tenNum=tenNum;
	}
	public synchronized String ruleOfSale(int num,int money){
		//synchronized(this);
		if(items==0){
			return "已经卖完了";
		}
		if(money==5){
			fiveNum++;
			items--;
			response="给你一个纪念品,你的钱正好。";
		}
		else if(money==10){
			while(fiveNum<1){
				try {
					System.err.println(""+num+"号顾客用10元购票,发生等待!");
					this.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			items--;
			fiveNum-=1;
			tenNum++;
			response="给你一个纪念品,你给了10元,找你5元。";
		}
		//唤起等待的现场
		this.notify();
		return response;
	}
}
/**
 * 顾客
 * @author Administrator
 *
 */
class Customer implements Runnable{
	int num;//顾客编号
	int money;//顾客使用的钱
	public Customer(int num,int money){
		this.num=num;
		this.money=money;
	}
	
	public void run() {
		try {
			Thread.sleep(300);
			System.out.println("我是"+num+"号顾客,我用"+money+"元购买纪念品,售货员说"+Buy.lady.ruleOfSale(num, money));
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		//System.out.println("我是"+num+"号顾客,我用"+money+"元购买纪念品,售货员说"+Buy.lady.ruleOfSale(num, money));	
	}
}

 

 

 

  • 大小: 20.3 KB
  • 大小: 19.4 KB
分享到:
评论

相关推荐

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

    在Java编程中,多线程买票问题是演示并发控制的经典示例。这个问题旨在展示如何在多个线程共享同一资源(如票库存)时确保数据的一致性和正确性。以下是三种不同方法来解决这个问题: 1. **使用`synchronized`...

    多线程java买票系统

    总结来说,这个多线程Java买票系统涵盖了Java线程编程的基础知识,包括线程创建、同步控制、线程池的使用以及并发问题的防范。通过分析和改进这个系统,可以深入理解Java多线程编程的原理和实践。

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

    当多个线程尝试卖票时,它们会依次进入`sellTicket()`,避免了数据竞争的问题。 接下来,我们可以创建多个线程模拟购票过程: ```java public class ThreadTicketTest { public static void main(String[] args) ...

    java实现多线程卖票功能

    在synchronized代码块中,我们还使用Thread.sleep方法来模拟卖票过程中的延迟。 在main方法中,我们创建了一个SellTickets1对象,并启动了三个线程来卖票。每个线程都将卖票,直到票数小于等于0为止。 通过这个...

    多线程设计一个火车售票模拟程序

    通过本实验,我们学会了如何使用 Java 语言设计一个多线程的火车售票模拟程序。我们了解了多线程设计的重要性,并学习了如何使用 synchronized 关键字来实现线程同步。这个程序可以作为一个简单的示例,展示了多线程...

    Java多线程同步具体实例.doc

    在`sell()`方法内部,我们首先检查是否有票可卖,如果有,则让当前线程休眠10毫秒,模拟售票过程,并减少票数。 除此之外,还有一种同步块的方式,即`synchronized(obj)`。这里我们看到另一个线程在`b`为`true`时会...

    demo.rar_DEMO_java线程_个

    在给定的"demo.rar_DEMO_java线程_个"压缩包中,我们可以看到一个关于Java线程使用的示例,特别是涉及到多窗口售票的场景。这个场景模拟了四个窗口(即四个线程)同时销售100张票的逻辑。 首先,我们需要理解Java中...

    简单实现多线程同步示例(模拟购票系统)

    本示例“简单实现多线程同步示例(模拟购票系统)”旨在通过一个具体的实例,帮助开发者理解如何在Java中创建并管理多线程以及如何实现线程同步,确保数据的一致性和正确性。 首先,我们要明确多线程的基本概念。在...

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

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

    Java实验6多线程.doc

    在Java编程中,多线程是一项重要的特性,它允许程序同时执行多个独立的任务,从而提高程序的并发性和效率。在Java实验6中,学生被要求将一对多的聊天程序改写为多线程的实现,这涉及到Java的并发处理和网络编程。 1...

    java 多线程异常处理

    在这个例子中,10个线程同时尝试卖票,如果不进行同步,就可能出现同一张票被多个线程卖出的问题。为了解决这个问题,使用了`synchronized`关键字来确保同一时间只有一个线程能访问共享资源——票数。这样就避免了...

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

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

    java线程同步的例子.pdf

    Java线程同步是一种控制多个线程访问共享资源的方式,以避免数据不一致和并发问题。在给定的代码示例中,展示了两种线程同步机制:synchronized 方法和 synchronized 代码块。 首先,我们来看看 `synchronized` ...

    Java多线程程序设计

    1. **创建Java线程对象**:学习如何通过继承`Thread`类或实现`Runnable`接口来创建新的线程。 2. **改变线程状态**:了解线程生命周期中的不同状态(新建、就绪、运行、阻塞和终止),并掌握如何通过`start()`、`...

    关于线程的动态停止,一个很经典的多线程麦票程序

    4. **多线程卖票问题**: - 这个例子可能模拟了一个售票系统,多个线程代表售票员,每个售票员都有自己的票库存。 - 非同步访问可能导致线程安全问题,例如“售票员卖出负数的票”。因此,必须使用同步机制,如`...

    使用多线程技术,模拟通过四个窗口卖出1000张火车票的功能。

    ### 使用多线程技术模拟四个窗口卖出1000张火车票 在现代软件开发中,多线程技术被广泛应用于提高程序的并发处理能力,从而提升应用性能和响应速度。本文将详细介绍如何使用Java多线程技术来模拟通过四个售票窗口...

    java多线程、通信机制、Thread类以及Runnable接口间的使用实例

    1. 写两个线程,一个线程打印1-52,另一个线程打印字母A-Z。打印顺序为12A34B56C……5152Z。...3.写一个程序,模拟4个售票窗口共同卖100张火车票的程序。 使用继承Thread类方式和实现Runnable接口两种方式实现。

    java 线程锁详细介绍及实例代码

    本文将深入探讨Java线程锁的使用、原理以及实例代码。 一、线程锁的概念与作用 线程锁,也称为互斥锁,主要用于控制多个线程对共享资源的访问,以避免并发执行时出现数据不一致的情况。当一个线程持有锁时,其他...

    多线程—模拟售火车票程序 TicketProductorConsumerThreadPrj

    车票购票 每次产生20张票(由生产者线程完成),由3台售票机同时循环向外出票(售票机就是消费者线程),编写一个卖票模拟小系统 要求: 20张票卖完了,售票机就不能卖了,等有票才可以; 产生了20张票,要等票卖了一些...

    javawork_java_火车票问题_thread_多线程编程_

    本项目以"火车票问题"为例,展示了如何通过多线程来模拟3个售票窗口同时售票的过程。下面我们将深入探讨相关知识点。 1. **线程基础**: - 线程是操作系统中的基本执行单元,每个线程都有自己的程序计数器、栈和...

Global site tag (gtag.js) - Google Analytics