JAVA多线程售票问题

今天在写页面静态化的时候,需要从mysql中查去昨天文章uuid,然后再从es中查询这些uuid的文章信息,再通过freemarker将信息写入html页面.

在写入页面的时候,考虑到单线程写入文件效率比较低,于是采用多线程方式将信息写入.这里出现了一个问题,这里可能重复的写入相同的html文件,这是不允许的.

于是想起售票问题.总的uuid(总票数)是确定的,分开每个线程只要保证每个线程获取到的uuid不冲突即可.

这里有一点和售票问题不同的是,售票只是关心的票数,在这里是要根据index获取list中的值,这里使用ArrayList存在问题.于是采用LinkedList,因为可以使用pop方法

程序还有两点可以优化:

  1.可以从es中根据uuid将数据一次查出或者分批次查出,然后写入文件,再进行查询

  2.每次写入文件后将信息放在list集合中,最后一次再将信息写入MySQL

现在贴上售票问题的代码:

class SaleTicket implements Runnable{
    private int tickets = 100;
    
    
    private synchronized void sale(){
        if(tickets > 0){
            System.out.println(Thread.currentThread().getName() + "卖出 第 "+ (tickets--)+"张票");
            
            try{
                Thread.sleep(100);
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        }
    }
    public void run(){
        while(tickets > 0){
            sale();
        }
    }
}


public class JavaTest {
        
    public static void main(String[] args){


        SaleTicket st = new SaleTicket();
        Thread t1 = new Thread(st, "一号窗口");
        Thread t2 = new Thread(st, "二号窗口");
        Thread t3 = new Thread(st, "三号窗口");
        Thread t4 = new Thread(st,"四号窗口 ");
        t1.start();
        t2.start();
        t3.start();
        t4.start();
        
    
        
    }
}

 

posted @ 2017-01-20 02:07  0xcafedaddy  阅读(309)  评论(0编辑  收藏  举报