Java ScheduledExecutorService生产者\消费者

Java ScheduledExecutorService生产者\消费者,java,concurrency,producer-consumer,java.util.concurrent,blockingqueue,Java,Concurrency,Producer Consumer,Java.util.concurrent,Blockingqueue,我有下一个项目: 基于Spring(3.2)的Web应用程序(Tomcat7),在后台我有几个任务 我有一个队列,里面有一些信息要处理。此队列正在定期更新(但仅当它为空时) 另外,我还有几个线程,它们周期性地将来自这个队列和进程的数据排队 对于调度,我想使用ScheduledExecutorService 我有几个问题: 如何保持这个队列?我认为这应该是全球性的。我应该在某个“holder”类中将其设置为静态吗?这不是一个糟糕的设计吗 使用ScheduledExecutorService初始化此

我有下一个项目:

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

我有一个队列,里面有一些信息要处理。此队列正在定期更新(但仅当它为空时)

另外,我还有几个线程,它们周期性地将来自这个队列和进程的数据排队

对于调度,我想使用ScheduledExecutorService

我有几个问题:

  • 如何保持这个队列?我认为这应该是全球性的。我应该在某个“holder”类中将其设置为静态吗?这不是一个糟糕的设计吗

  • 使用ScheduledExecutorService初始化此队列和所有任务的最佳位置在哪里?ServletContextLoadingListener是一个好地方吗?有什么方法可以用Spring初始化它吗

  • 如果需要精确控制使用者线程的数量,是否应该使用多个ScheduledExecutorService实例

  • ArrayBlockingQueue适合这种情况吗

  • 您可以使用一个普通类,让spring使用作用域
    singleton
    来管理它
  • 您可以在spring配置中使用
    init方法
    配置bean,或者在类中实现
    initializebean
    接口
  • ScheduledExecutorService
    的线程号可通过构造函数参数进行配置。如果您有多种类型的任务,并且希望在单独的线程池中运行它们,则可以使用多个
    ScheduledExecutorService
    实例。但是,如果您的所有任务都属于同一类型,我认为不需要多个
    ScheduledExecutorService
    实例
  • JDK中提供的
    ScheduledThreadPoolExecutor
    具有类
    java.util.concurrent.ScheduledThreadPoolExecutor.DelayedWorkQueue.DelayedWorkQueue
    的内部工作队列(并且它是不可配置的)。我不知道你把ArrayBlockingQueue放在哪里了

  • 谢谢,关于第4项,我需要有一个可更新的队列,其中包含一些由工作线程处理的数据,因为据我所知,DelayedWorkQueue位于ScheduledExecutorService中,我在那里提交的是工作线程。