Java模拟售票

#题目要求
设计一个多线程程序如下:设计一个火车售票模拟程序。假如火车站要有100张火车票要卖出,现在有5个售票点同时售票,用5个线程模拟这5个售票点的售票情况
1、要求打印出每个售票点所卖出的票号
2、各售票点不能售出相同票号的火车票
#思路
首先建立一个共享售票类以及5个线程,对类的打印操作上锁,保证每时每刻只能有一个线程在使用该方法。
本来想用Set来获取不重复的随机数,后来发现无法获取它的单个元素,于是用了类似于桶排序的方法来获取1-100的不重复的随机数

import java.util.*;



import java.lang.Thread;
// super this 均不能引用static private等定义的成员 变量
public class Test04 {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		SellticketTask sellticket=new SellticketTask(); //初始化任务
		Thread s1=new Thread(sellticket);                  //创建线程1
		s1.setName("售票点1");
		Thread s2=new Thread(sellticket);                  //创建线程2
		s2.setName("售票点2");
		Thread s3=new Thread(sellticket);                  //创建线程3
		s3.setName("售票点3");
		Thread s4=new Thread(sellticket);                  //创建线程4
		s4.setName("售票点4");
		Thread s5=new Thread(sellticket);                  //创建线程5
		s5.setName("售票点5");
		System.out.println("开始售票");
		System.out.println("售票点	票号	剩余票数");
		s1.start();
		s2.start();
		s3.start();
		s4.start();
		s5.start();
		
	}
}


//售票
class SellticketTask implements Runnable{
	static int Ticket_num=100;  //保持票数统一 票数要静态
	public volatile boolean exit = false; 
    int temp;
    int flag[]=new int[101];
    Random rand = new Random();
	public SellticketTask(){
		for(int i=0;i<101;i++) {
	    	flag[i]=-1;
	    }
	}

	public  void run() {
		while(Ticket_num>0) {
			synchronized(this) {
				if(Ticket_num>0) {
					while(true) {
						temp=(int) (rand.nextInt(100)+1);
						if(flag[temp]!=0) {
							flag[temp]=0;
							break;
						}
					}
					
					System.out.println(Thread.currentThread().getName()+":	"+temp+"	"+--Ticket_num);
					try{
					     Thread.sleep(new Random().nextInt(100));
					    }catch(Exception e) {
					    	e.printStackTrace();
					    }
					
				}
				
			}
		}
		
		
		
	}
	
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值