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 一样?的主要内容,如果未能解决你的问题,请参考以下文章

异步多线程----执行器(Executor)

ThreadPool 没有立即启动新线程

ThreadPoolExecutor

ThreadPoolExecutor使用介绍

如何使用ThreadPool

Eclipse总是自动跳到ThreadPoolExecutor