【问题标题】:ThreadPool is to Executor like Polling is to?ThreadPool 是 Executor 就像 Polling 一样?
【发布时间】:2023-03-31 07:22:01
【问题描述】:

Java 的 Executor(据我所知)是 ThreadPool 概念的抽象——可以接受和执行(执行)任务的东西。

我正在为 Polling 概念寻找一个类似的例外。我需要不断地从特定队列(没有实现BlockingQueue)轮询(出列)项目,执行它们并休眠,然后重复所有这些直到关机。

有现成的抽象还是我自己写点东西?

(欢迎提出更好的标题)

【问题讨论】:

  • 标题建议:“如何将自定义队列集成到 j.u.c 执行器中?”
  • 对我来说标题很好,我从你的标题中明白了你想要什么。它有一个谜一样的戒指。
  • 嗯,一个建议是使用 Quartz ffs!我不认为标题是明确的。轮询是几行代码(见下面我的回答),而线程池可能有一千行。为什么你需要一个抽象层来处理几个 loc?

标签: java polling executor gigaspaces


【解决方案1】:

投票很简单:

Thread t = new Thread(new Runnable() {
    public void run() {
        try {
            while (!t.isInterrupted()) {
               Object item;
               while ((item = queue.take()) == null) {//does not block
                   synchronized (lock) { lock.wait(1000L) } //spin on a lock
               }
               //item is not null
               handle(item);
            }
        } catch (InterruptedException e) { }
    }
});
t.start();

也许您需要重新表述您的问题,因为我不太确定您要做什么?

【讨论】:

  • 我自己的队列是自定义的(一个 GigaSpaces 队列),它没有实现 BlockingQueue 接口。
  • 然后添加一个简单的适配器来实现接口并委托给你的队列实现
  • 我不能 - GigaSpaces 是一个分布式网格 - 对队列的 push() 操作是在另一台计算机上完成的。因此,我需要的是实际的轮询——我不知道如何实现 BlockingQueue。
  • 队列的接口是 write() 和 take() - 因为 write() 是在另一台计算机上发生的(我的进程可能还没有启动),所以我无法进行任何操作那就拿吧。我需要的是一个持续轮询这个队列的线程(调用 take()),并有一些最小的生命周期管理。
  • take() 不阻塞吗? (见我上面的回答)。我仍然不明白为什么您不能编写适配器(只要 take 操作按应有的方式运行,谁将项目放入队列并不重要)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-13
  • 1970-01-01
  • 1970-01-01
  • 2011-06-09
  • 2021-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多