【问题标题】:ScheduledExecutorService - Ignore already running runnableScheduledExecutorService - 忽略已经运行的可运行
【发布时间】:2015-08-24 17:52:59
【问题描述】:

我正在使用预定的执行器服务

private ScheduledExecutorService pool = new ScheduledThreadPoolExecutor(1);

以固定速率运行可运行对象

pool.scheduleAtFixedRate(new CoolRunnable(), 10, 10, TimeUnit.MILLISECONDS);

这个线程池等待上一个执行完成,但我希望它每 10 毫秒运行一次可运行对象,无论上一个是否完成。

我该怎么做?

编辑: 修复了用连接池替换 MySQL 连接的问题。正常的连接方法是同步的,这就是runnables必须互相等待的原因。

【问题讨论】:

    标签: java threadpool runnable scheduledexecutorservice


    【解决方案1】:

    为此,您需要每 10 秒向 ExecutorService 提交一个任务。这个ExecutorService 将负责运行任务:

    ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
    ExecutorService workers = Executors.newCachedThreadPool();
    
    scheduler.scheduleAtFixedRate(new Runnable {
        @Override
        public void run() {
            workers.submit(new CoolRunnable());
        }
    }, 10, TimeUnit.SECONDS);
    

    如果旧线程仍在工作,使用 cachedThreadPool 将创建新线程。这样做要小心:如果任务运行时间更长,每 10 秒添加一个新任务可能会创建大量并发线程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-20
      • 2011-11-27
      • 1970-01-01
      • 2012-02-07
      • 2017-10-17
      • 1970-01-01
      • 1970-01-01
      • 2015-03-03
      相关资源
      最近更新 更多