zoukankan      html  css  js  c++  java
  • 多线程售票示例

    业务介绍:

      多线程执行春节车票售卖!

    代码逻辑如下:

    /**
     * 售票任务
     */
    class TaskRunnable implements Runnable{
    
        /**
         * 剩余车票数量
         */
        private AtomicInteger count;
    
        /**
         * 当前任务名称
         */
        private String taskName;
    
        /**
         * 任务锁
         */
        private ReentrantLock lock;
    
        public TaskRunnable(AtomicInteger count, String taskName, ReentrantLock lock) {
            this.count = count;
            this.taskName = taskName;
            this.lock = lock;
        }
    
        @Override
        public void run() {
            System.out.println(taskName + "号售票厅的开始售票~~");
            while (true) {
                this.lock.lock();
    
                if (this.count.get() <= 0) {
                    //任务结束解锁
                    this.lock.unlock();
                    break;
                }
                System.out.println("恭喜抢到" + taskName+"号销售厅的车票! 当前剩余车票数" + this.count.decrementAndGet());
                this.lock.unlock();
            }
            System.out.println(taskName+"号售票厅的售票结束--");
        }
    }
    售票任务类
    /**
     * @author Kevin
     * @DateTime 2019/1/12 11:08
     * @Description
     */
    public class ExecutorServiceL {
    
        public static void main(String[] args) {
    
            //创建线程池
            ExecutorService executorService = getExecutor();
    
            //执行任务
            executeTask(executorService);
    
            while (true) {
                if (((ThreadPoolExecutor) executorService).getActiveCount() <= 0) {
                    System.out.println("售票结束~~");
                    break;
                }
            }
            try {
                /**
                 * 关闭线程池:
                 * 1.不在接收新的任务
                 * 2.等待已执行任务执行完毕
                 * 3.关闭线程池(清除尚未执行任务,试图停止正在执行的任务)
                 */
                executorService.shutdown();
                if (!executorService.awaitTermination(2, TimeUnit.SECONDS)) {
                    System.out.println("尚未执行任务列表: "+executorService.shutdownNow());
                }
    
            } catch (Exception e) {
                System.out.println("超出时间强制结束!");
            }
        }
    
        /**
         * 执行任务
         *
         * @param executorService
         */
        public static void executeTask(ExecutorService executorService) {
    
            //总车票数
            AtomicInteger total = new AtomicInteger(30);
            //线程锁
            ReentrantLock lock = new ReentrantLock();
    
            executorService.execute(new TaskRunnable(total, "1", lock));
            executorService.execute(new TaskRunnable(total, "2", lock));
            executorService.execute(new TaskRunnable(total, "3", lock));
            executorService.execute(new TaskRunnable(total, "4", lock));
        }
    
        /**
         * 获取线程池
         *
         * @return
         */
        public static ExecutorService getExecutor() {
            return new ThreadPoolExecutor(
                    2,
                    4,
                    2,
                    TimeUnit.SECONDS,
                    new SynchronousQueue(),
                    new ThreadPoolExecutor.DiscardOldestPolicy()
            );
        }
    }
    售票入口
  • 相关阅读:
    域名交易网
    android canvas 二
    android 获取当前时间
    loadrunner 面向目标的场景load Generator 连接 失败
    开发平台
    java 调用 bat 如果里面用了第三方命令 dos 窗口没有关闭 解决方法
    Socket网络框架 MINA
    JQuery引用
    Jmeter
    android 获取 service 信息
  • 原文地址:https://www.cnblogs.com/sunshinekevin/p/10259792.html
Copyright © 2011-2022 走看看