模拟实现多线卖票,100张票,有多个售票员卖,代码实现如下
实现票类
import java.util.Arrays;
public class TickerPool {
private static int num; //票的数量
private static boolean[] tickets; //存放票
static {
num = 100; //100张票
tickets = new boolean[num];
Arrays.fill(tickets,false);//false没有卖出去得票
}
/**
* 获取一张票的下标
* 如果有票,返回下标
*
*/
public static int getEmpty(){
for(int i = 0 ;i < tickets.length ;i++){
if(tickets[i] == false){
return i;
}//有票
}
return -1;//没有票
}
/**
* 卖票
*/
public static void sold(int index){
tickets[index] = true;
}
}
实现售票员
public class Solder implements Runnable{
Object lock = new Object();//synchronized需要传入一个对象,建立一个空对象
@Override
public void run() {
while (true){
synchronized (lock){ //同步 保证同一时间只有一个线程访问
//查询
int no = TickerPool.getEmpty();
System.out.println(Thread.currentThread().getName()+"查询"+no);
if(no == -1){
break;
}//没有票
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}//出售
TickerPool.sold(no);
System.out.println(Thread.currentThread()+":售票:"+no);
}
}
}
}
Main类
public class Main {
public static void main(String[] args) {
Solder solder = new Solder();
Thread t1 = new Thread(solder,"张三");
Thread t2 = new Thread(solder,"李四");
Thread t3 = new Thread(solder,"王五");
Thread t4 = new Thread(solder,"赵六");
t1.start();
t2.start();
t3.start();
t4.start();
}
}