#题目要求
设计一个多线程程序如下:设计一个火车售票模拟程序。假如火车站要有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();
}
}
}
}
}
}