Java TimerTask 应该等待阻塞队列

标签 java multithreading timertask

我有以下设计:

有一个任务扩展了TimerTask,并且计划每分钟运行一次。 此任务将尝试从中央队列(作为单个消费者)获取项目并将其表示形式写入文件中。

此外,还有多个生产者不时将项目放入中央队列。

我感兴趣的是,每次执行任务(执行 run() 方法)时,如果有项目,它将从队列中提取所有项目,如果有没有任何项目不执行任何操作。

如果队列已满,生产者应该在队列上 hibernate 。

我对这个问题的解决方案是:

创建扩展 TimerTask 的 ExtractTask。 ExtractTask 将包含一个 BlockingQueue。 每个生产者将通过执行 getQueue() 方法接收对队列实例的引用。 生产者将执行 BlockingQueue.put() 方法。 消费者将在 run() 中执行 BlockingQueue.poll() 方法。

你能提出更好的设计吗?我的设计是否包含任何有问题的场景案例?此设计可能会遇到任何同步问题吗?

最佳答案

我愿意:

  • 将队列与设计中的任务分开,
  • 注入(inject)队列而不是进行查找,
  • 使用 SchedulerService 而不是 TimerTask

除此之外,你已经得到了它。

如果您愿意冒依赖 Spring 的风险,您应该查看 Spring Integration 。您描述的所有组件都在那里。您还可以使用许多其他框架来解决问题,例如 Camel 或 Akka;我的主要观点是,如果不是绝对必要的话,不要自己维护此代码。

免责声明:我有点biased about Spring Integration

关于Java TimerTask 应该等待阻塞队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13014115/

相关文章:

java - 定时器已取消

Java Swing - 按下的键未释放(有时)

java - distanceTo() 整数溢出?

c# - C#BackgroundWorker偶尔需要很长时间才能启动

java - 在 Java 线程中发送和接收事件

java - 如何在运行时更改我的 TimerTask 的执行周期?我

java - 简洁的 API 设计

java - 在 Java 中使用 SQL Server 数据库

c++ - 如何在 native C++ 中跨线程调用(在主线程上回调)

android - 在 android 中重复执行任务的最佳方法是什么? (例如 :- Refreshing scores, 更新用户界面)