JAVA多线程买票简化版

package hello;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

//文件起名的时候就叫ThreadTicket,叫个售票窗口可能更形象,票面简化为直达某地

public class ThreadTicket extends Thread{
    
    String buyer;
    ArrayList<String> ticketList;
    
    
    public String getBuyer() {
        return buyer;
    }

    public void setBuyer(String buyer) {
        this.buyer = buyer;
    }

    public ArrayList<String> getTicketList() {
        return ticketList;
    }

    public void setTicketList(ArrayList<String> ticketList) {
        this.ticketList = ticketList;
    }

//上锁简化,这里这可有其它关键字或更复杂的技术手段应对实际场景   

 public void sale() {
        synchronized (ThreadTicket.class) {
            if(ticketList.size()>0) {
                System.out.println(buyer+":"+ticketList.get(0));
                ticketList.remove(0);
            }
        }
//抢票效果叫最后说明        
//        if(ticketList.size()>0) {
//            System.out.println(buyer+":"+ticketList.get(0));
//            ticketList.remove(0);
//        }
        
    }
    
    @Override
    public void run() {
        // TODO Auto-generated method stub
        super.run();
        this.sale();
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        
        List<String> userList=Arrays.asList("smith","john","lisa","sarah","tom","phil");
        
        
        ArrayList<String> ticketList=new ArrayList<String>();
        ticketList.add("北京");
        ticketList.add("上海");
        ticketList.add("廊坊");
        ticketList.add("沧州");
        ticketList.add("石家庄");
        ticketList.add("秦皇岛");
        
        
        
        Thread[] threads=new Thread[6];
        
        for(int i=0;i<threads.length;i++) {
            ThreadTicket thread=new ThreadTicket();
            thread.setBuyer(userList.get(i));
            thread.setTicketList(ticketList);
            threads[i]=new Thread(thread);
            

//优先级效果不明显
//            if(i==4) {
//                threads[i].setPriority(10);
//            }
            threads[i].start();
            
 //sleep代表强制排队,这里可以采用其它技术手段           
//            try {
//                threads[i].sleep(1000);
//            } catch (InterruptedException e) {
//                // TODO Auto-generated catch block
//                e.printStackTrace();
//            }   
        }        
    }

}
 

最后抢票出现的意外问题:

smith:北京
lisa:上海
sarah:廊坊
john:沧州
tom:石家庄
phil:秦皇岛
排队顺序被打乱

smith:北京
john:上海
tom:廊坊
lisa:廊坊
phil:石家庄
sarah:秦皇岛
卖完的票未来及删除

smith:北京
lisa:上海
john:北京
sarah:沧州
tom:石家庄
phil:秦皇岛
即有加塞还有重票完全乱掉

同步以后
john:北京
phil:上海
smith:廊坊
tom:沧州
sarah:石家庄
lisa:秦皇岛
未解决插队的问题

smith:北京
sarah:北京
john:北京
tom:上海
lisa:石家庄
phil:秦皇岛
有重票
-------------
john:北京
phil:上海
smith:廊坊
tom:沧州
sarah:石家庄
lisa:秦皇岛

无重票但有加塞情况
---------------
john:北京
sarah:上海
phil:廊坊
smith:北京
lisa:廊坊
tom:石家庄

仍未解决

——————

smith:北京
john:上海
lisa:廊坊
sarah:沧州
tom:石家庄
phil:秦皇岛

sleep仅代表强制按照排队顺序依次购买,未考虑业务场景


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值