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