【问题标题】:Java ScheduledExecutorService producer\consumerJava ScheduledExecutorService生产者\消费者
【发布时间】:2013-02-09 23:19:06
【问题描述】:

我有下一个项目:

基于 Spring(3.2) 的 Web 应用程序(Tomcat 7),在后台我有几个任务。

我有一个队列,其中包含一些要处理的信息。此队列会定期更新(但只是在它为空时)。

我还有几个线程定期从这个队列和进程中排队数据。

对于调度,我想使用 ScheduledExecutorService。

我有几个问题\疑问:

  1. 如何保留此队列?我认为它应该是全球性的。我应该在某个“持有人”类中使其成为静态吗?这不是一个糟糕的设计吗?

  2. 用 ScheduledExecutorService 初始化这个队列和所有任务的好地方在哪里? ServletContextLoadingListener 是一个好地方吗?有什么方法可以用 Spring 来初始化它吗?

  3. 如果我需要精确控制消费者线程的数量,是否应该使用多个 ScheduledExecutorService 实例?

  4. ArrayBlockingQueue 是否适合这种情况?

【问题讨论】:

    标签: java concurrency producer-consumer java.util.concurrent blockingqueue


    【解决方案1】:
    1. 你可以使用一个普通的类,让spring用作用域singleton来管理它。
    2. 您可以在 spring 配置中使用 init-method 配置 bean,或者在您的类中实现 InitializingBean 接口。
    3. ScheduledExecutorService 的线程号可通过构造函数参数进行配置。如果您有多种类型的任务并希望在单独的线程池中运行它们,您可以使用多个ScheduledExecutorService 实例。但是,如果您的所有任务都属于同一类型,我认为不需要多个 ScheduledExecutorService 实例。
    4. JDK 中提供的ScheduledThreadPoolExecutor 有一个java.util.concurrent.ScheduledThreadPoolExecutor.DelayedWorkQueue.DelayedWorkQueue 类的内部工作队列(它是不可配置的)。我不确定您将 ArrayBlockingQueue 放在哪里。

    【讨论】:

    • 谢谢,关于第 4 项,我需要一个可更新队列,其中包含一些数据量供工作线程处理,据我了解,DelayedWorkQueue 位于 ScheduledExecutorService 内部,它适用于我提交的工作线程在那里。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-24
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多