ThreadPool 是 Executor 就像 Polling 一样?
Posted
技术标签:
【中文标题】ThreadPool 是 Executor 就像 Polling 一样?【英文标题】:ThreadPool is to Executor like Polling is to? 【发布时间】:2009-07-07 06:40:08 【问题描述】:Java 的 Executor(据我所知)是 ThreadPool 概念的抽象——可以接受和执行(执行)任务的东西。
我正在为 Polling 概念寻找一个类似的例外。我需要不断地从特定队列(没有实现BlockingQueue
)轮询(出列)项目,执行它们并休眠,然后重复所有这些直到关机。
有现成的抽象还是我自己写点东西?
(欢迎提出更好的标题)
【问题讨论】:
标题建议:“如何将自定义队列集成到 j.u.c 执行器中?” 对我来说标题很好,我从你的标题中明白了你想要什么。它有一个谜一样的戒指。 嗯,一个建议是使用 Quartz ffs!我不认为标题是明确的。轮询是几行代码(见下面我的回答),而线程池可能有一千行。为什么你需要一个抽象层来处理几个 loc? 【参考方案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 操作按应有的方式运行,谁将项目放入队列并不重要)以上是关于ThreadPool 是 Executor 就像 Polling 一样?的主要内容,如果未能解决你的问题,请参考以下文章