【问题标题】:placing functions executed by multiple threads into a Queue将多个线程执行的函数放入队列
【发布时间】:2015-04-22 16:01:40
【问题描述】:

我目前正在 Java 中创建一个库模拟器。这个库有多个借阅者,它们是线程。 每个 Borrower 线程执行一个功能列表,例如(创建借阅列表、从图书馆借书、将书还给图书馆)。在模型类中创建了一个借用者数组,每个线程都在 for 循环中启动。我目前遇到的问题是将借款人运行的函数放入一种输出队列中,从而运行第一个借款人输入的第一个函数等。

我的问题是,有没有办法,而不是在每个借用线程到达时执行每个函数,而是将来自所有线程的函数放入一个输出队列中,以便它可以通过?

【问题讨论】:

  • 您可能会查看 Java 的 BlockingQueue 实现(例如 ArrayBlockingQueue),它为您所说的生产者-消费者模式提供了一种方便的集合实现。
  • 放入队列的对象可以是任何对象:数据对象、策略、lambda 函数...有什么问题?
  • 我想要实现的是,与其让每个线程一个一个地执行,我宁愿它们一个一个地执行某个功能。一个例子是“向图书馆索要一套图书”。
  • 您是在问如何完全摆脱“借用者”线程吗?如果我被要求实现一个高性能、可扩展、精益求精的库模拟器,我会这样做;但缺点是,我的代码比你描述的更难理解。使用线程,一次只做一件事,彼此独立,是一种非常直观的建模的方法,他们一次只做一件事,而且通常是相互独立的。
  • 我的高性能库模拟器看起来像一个操作系统调度程序,有状态的“借用”对象(有点像操作系统进程)和不同的队列(包括按时间排序的睡眠队列)借款人可能需要等待的每一件事。当我的一个借款人需要做某事(即推进其状态)时,我的调度程序将从任何队列中挑选它,并将其添加到线程池的队列中(有点像操作系统“运行队列”) ,并且池线程将调用适当的方法来更新借用者并将其放入下一个队列。)

标签: java multithreading queue


【解决方案1】:

我使用BlockingDequeLink,先进先出)解决了类似的问题。 消费者线程从双端队列中弹出第一个Task 并处理它。完成后,他报告并接受下一个任务,依此类推。 其他线程 - 在你的情况下是借款人 - 只需将任何任务放入最后一个位置的双端队列。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多