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(); } }