Java ScheduledExecutorService producer \ consumer

时间:2013-02-24 20:38:10

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

我有下一个项目:

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

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

此外,我还有几个线程会定期将此队列和进程中的数据排入队列。

为了安排我想使用ScheduledExecutorService。

我有几个问题\问题:

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

  2. 使用ScheduledExecutorService初始化此队列和所有任务的好地方在哪里? ServletContextLoadingListener是一个好地方吗?有没有办法用Spring初始化它?

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

  4. ArrayBlockingQueue会对这种情况有好处吗?

1 个答案:

答案 0 :(得分:1)

  1. 您可以使用普通类,让spring使用范围singleton管理它。
  2. 您可以在spring配置中使用init-method配置bean,或在您的班级中实现InitializingBean接口。
  3. ScheduledExecutorService的线程号可通过构造函数参数进行配置。如果您有多种类型的任务并希望在单独的线程池中运行它们,则可以使用多个ScheduledExecutorService实例。但是,如果您的所有任务属于同一类型,我就不会发现需要多个ScheduledExecutorService个实例。
  4. JDK中提供的ScheduledThreadPoolExecutor具有类java.util.concurrent.ScheduledThreadPoolExecutor.DelayedWorkQueue.DelayedWorkQueue的内部工作队列(并且不可配置)。我不知道你把ArrayBlockingQueue放在哪里。