• 线程池(4)Executors.newScheduledThreadPool-只执行1次


    例子1:延迟3秒后,只执行1次

    ScheduledExecutorService es = Executors.newScheduledThreadPool(5);
            log.info("开始时间");
            try {
                for (int i = 0; i < 20; i++) {
                    Runnable syncRunnable = new Runnable() {
                        @Override
                        public void run() {
                            log.info(Thread.currentThread().getName());
                        }
                    };
                    es.schedule(syncRunnable, 3000, TimeUnit.MILLISECONDS);
                }
            } finally {
                es.shutdown();
            }

    运行结果:

                10:41:39.589 开始时间
                10:41:42.595 pool-1-thread-1
                10:41:42.595 pool-1-thread-2
                10:41:42.595 pool-1-thread-3
                10:41:42.595 pool-1-thread-4
                10:41:42.596 pool-1-thread-2
                10:41:42.596 pool-1-thread-5
                10:41:42.596 pool-1-thread-1
                10:41:42.596 pool-1-thread-3
                10:41:42.597 pool-1-thread-4
                10:41:42.597 pool-1-thread-2
                10:41:42.597 pool-1-thread-5
                10:41:42.597 pool-1-thread-1
                10:41:42.598 pool-1-thread-3
                10:41:42.598 pool-1-thread-4
                10:41:42.598 pool-1-thread-2
                10:41:42.599 pool-1-thread-5
                10:41:42.599 pool-1-thread-1
                10:41:42.600 pool-1-thread-3
                10:41:42.600 pool-1-thread-4
                10:41:42.600 pool-1-thread-2

    调用的ThreadPoolExecutor:

    public ScheduledThreadPoolExecutor(int corePoolSize) {
            super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
                  new DelayedWorkQueue());
        }

    corePoolSize=5,maximumPoolSize=Integer.MAX_VALUE

    keepAliveTime=0纳秒

    allowCoreThreadTimeout=false(默认)

    采用延迟队列DelayedWorkQueue

    因此,

    • 线程池中的线程数永远是5,永久存活
    • 对于新任务,当队列未满时,插入队列;当队列已满时,默认执行AbortPolicy,即抛出异常。
    • 支持线程reuse

    因此,类似newFixedThreadPool

     

    public ScheduledThreadPoolExecutor(int corePoolSize) {        super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,              new DelayedWorkQueue());    }

  • 相关阅读:
    微信小程序之阻止冒泡事件
    微信小程序之生成二维码
    微信小程序之数据缓存和数据获取
    微信小程序之分享功能
    抽丝剥茧——策略设计模式
    抽丝剥茧——单例设计模式
    抽丝剥茧——备忘录设计模式
    手把手教你Smarty缓存技术(转)
    二级域名session 共享方案(转)
    MySQL监控、性能分析——工具篇
  • 原文地址:https://www.cnblogs.com/yaoyuan2/p/9606546.html
Copyright © 2020-2023  润新知