• 线程池(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());    }

  • 相关阅读:
    设计模式 之 单例模式
    leetcode 69 x 的平方根 牛顿迭代法
    leetcode 98 验证二叉搜索树
    leetcode 54 螺旋数组
    第一篇-python入门
    python-入门
    python
    线性判别分析LDA总结
    LDA
    线性判别分析(LDA)原理
  • 原文地址:https://www.cnblogs.com/yaoyuan2/p/9606546.html
Copyright © 2020-2023  润新知