首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

多线程背课_售票_走走转

2012-12-26 
多线程背课__售票_转转转票真难买呀,咋回个家就怎么难呢??? 这几天学习了下线程,加上买票的事,就写了个模

多线程背课__售票_转转转

票真难买呀,咋回个家就怎么难呢??多线程背课_售票_走走转
? 这几天学习了下线程,加上买票的事,就写了个模拟售票窗口买票的问题:有四个窗口对顾客售票,一个顾客只能买一张票.
? 1.Consumer类
/**
* 顾客
* @author xpery
*
*/
public class Consumer? implements Runnable {
??? private Ticket ticket;
??? public Consumer(Ticket ticket){
??????? this.ticket= ticket;
??? }
??? public void run() {
??????? while(true){
??????????? ticket.getConsumer();
??????????? if(ticket.ticketNum<=0){
??????????????? System.out.println("售票窗口已关闭,请明天再来!");
??????????????? break;
??????????? }
??????? }
??? }
}

2.Windows类
/**
* 窗口
* @author Xpery
*
*/
public class Windows implements Runnable {
??? private Ticket ticket;

??? public Windows(Ticket ticket){
??????? this.ticket = ticket;
??? }
??? public void run() {
??????? while (true) {
??????????? ticket.saleTicket();
??????????? if(ticket.ticketNum<=0){
??????????????? System.out.println("关闭售票窗口"+Thread.currentThread().getName());
???????????????? break;
??????????? }
??????? }
??? }
}

3.Ticket类
import java.util.Vector;

public class Ticket {
??? // 总票数
???? public? int ticketNum = 100;
??? // 是否有顾客
???? private boolean isConsumer = false;
??? private Vector<Integer> numVector = new Vector<Integer>();

??? /**
???? * 售票
???? */
??? public synchronized void saleTicket() {
??????? // 是否有顾客,没有就等待
??????? if (!isConsumer) {
??????????? try {
??????????????? wait();
??????????? } catch (InterruptedException e1) {
???????????????? e1.printStackTrace();
??????????? }
??????? }
??????? if (ticketNum > 0) {
??????????? System.out.println(Thread.currentThread().getName() + "卖给"
??????????????? + getConsumerName() + "一张票,票号为:" + ticketNum-- + "票");
??????? }
??????? try {
???????????? Thread.sleep(10);
??????? } catch (InterruptedException e) {
???????????? e.printStackTrace();
??????? }
??????? isConsumer = false;
??????? notify();
??? }
??? /**
???? * 获取顾客
????? */
??? public synchronized void getConsumer() {
??????? // 是否有顾客,有就等待
??????? if (isConsumer) {
??????????? try {
??????????????? wait();
??????????? } catch (InterruptedException e) {
??????????????? e.printStackTrace();
??????????? }
??????? }
??????? // 判断票是否已经售完
???????? if(ticketNum==0){
??????????? System.out.println("对不起,今天的票已售完,请明天早点来!");
??????? }
??????? try {
??????????? Thread.sleep(10);
??????? } catch (InterruptedException e) {
??????????? e.printStackTrace();
??????? }
??????? isConsumer = true;
??????? notify();
??????? }
??? /**
???? * 获取顾客名称
????? * @return
???? */
??? public String getConsumerName() {
??????? int num = Integer.valueOf((int)(Math.random() * 999 + 1));
??????? String consumerName="顾客" + num;
??????? // 判断是否有人重复买票
???????? while (numVector.contains(num)) {
??????????? System.out.println("对不起,"+consumerName+" ,您已经买了一张票,不能再买一张了");
??????????? num = Integer.valueOf((int)(Math.random() * 999 + 1));
??????? }
??????? numVector.add(num);
??????? return consumerName;
??? }
}
4.主程序:MianTest
public class MianTest {

??? public static void main(String[] args) {
??????? Ticket ticket = new Ticket();

?????? /**
??????? * 产生一个顾客对象,用来获取顾客
???????? */
??????? Consumer consumer = new Consumer(ticket);
??????? Thread threadConsumer = new Thread(consumer);
??????? threadConsumer.start();

?????? /**
??????? * 产生四个窗口
???????? */
??????? Windows windows = new Windows(ticket);
??????? for (int i = 1; i < 5; i++) {
??????????? Thread threadWindows = new Thread(windows);
??????????? threadWindows.setName(i + "号窗口");
??????????? threadWindows.start();
??????? }
??? }
}

热点排行