0

这是我的问题:

  1. 我在收到事件后执行了一个长时间运行的计算(我们称之为“任务”)。
  2. 这些事件告诉我还有更多数据需要处理。该事件包括我现在可以安全地处理任务数据的位置的索引。
  3. 当我收到一个新事件时,我最终需要处理更多数据。
  4. 当我收到一个新事件时,我不想取消现有任务,而是让它完成,然后开始下一个任务。
  5. 如果我在一个任务期间收到多个事件,下一个任务应该只处理最近的事件并丢弃所有以前的事件。
  6. 我只有足够的资源一次处理一项任务。

是否有Executors.newSingleThreadExecutor()我可以用来实现上述条件的修改版本?我可以用 BlockingQueue 或 AtomicReferences 做一些优雅的事情吗?有没有一种简单的方法来做我上面描述的事情?

4

2 回答 2

0

可能希望扩展 ThreadPoolExecutor 以实现所需的结果,例如

new ThreadPoolExecutor(min, max, keepAliveTime,
        TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()) {

      @Override
      protected void beforeExecute(Thread t, Runnable r) {
        while (isThrottle()) {
          try {
            TimeUnit.MILLISECONDS.sleep(timeout);
          } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            break;
          }
        }
      }

      private double isThrottle() {
        // TODO: 
      }
    };
于 2014-01-29T16:52:12.477 回答
0

尝试使用 Java ScheduledThreadPoolExecutor,它是 ThreadPoolExecutor 的扩展。您可以将线程池​​大小限制为 1,以确保仅从队列中挑选一个任务。对您来说唯一的问题是 ScheduledThreadPoolExecutor 在内部使用了一个延迟队列的实现,它是一个无界队列,但您只希望选择最后一个任务/事件。

您可能必须扩展 ScheduledThreadPoolExecutor 类并使用与绑定到当前 ScheduledThreadPoolExecutor 实现的 DelayedWorkQueue 不同的队列。请注意,DelayedWorkQueue 只是一个 BlockingQueue 实现,它在后台使用了一个 DelayQueue。覆盖所有 schedule* 方法并实现您自己的任务边界。

于 2013-05-04T00:53:42.063 回答