0

目前我有一个算法,有点像网络蜘蛛或文件搜索系统——它有一组要处理的元素,处理元素可以导致更多元素排队。

然而这个算法是单线程的——这是因为我从数据库中获取数据并且希望一次只有一个数据库连接。在我目前的情况下,性能并不重要 - 我这样做只是为了可视化目的以简化调试。

对我来说,使用队列抽象似乎很自然,但是似乎使用队列意味着多线程 - 据我了解,大多数标准 java 队列实现都驻留在 java.util.concurrent 包中。

队列接口实现列表

我知道我可以继续使用任何支持拉取推送的数据结构,但我想知道在这种情况下使用哪种数据结构更自然(可以在单线程应用程序中使用队列吗?)。

4

4 回答 4

3

java.util.concurrent使用单线程结构基本上没问题。

需要注意的主要事情是阻止呼叫。如果您使用像 an 这样的有限大小结构ArrayBlockingQueue,并且在已满的队列上调用该put方法,则调用线程将阻塞,直到队列中有空间。如果您使用任何类型的队列并take在它为空时调用,则调用线程将阻塞,直到队列中有东西。如果您的应用程序是单线程的,那么这些事情就永远不会发生,这意味着永远阻塞。

为避免put阻塞,您可以使用无界结构,例如LinkedBlockingQueue. 为避免在删除时阻塞,请使用非阻塞操作 -remove如果队列为空,则抛出异常,并poll返回 null。

话虽如此,有些Queue接口的实现不在java.util.concurrent. ArrayDeque可能是一个不错的选择。

于 2012-06-26T12:01:33.453 回答
1

可以在单线程应用程序中使用任何队列。在没有并发线程的情况下,同步开销应该可以忽略不计,并且只有在元素处理时间非常短时才会引起注意。

于 2012-06-26T12:01:49.557 回答
1

队列在 java.util 中定义。LinkedList 是一个队列,对并发不太友好。没有 Queue 方法阻塞,因此从单线程的角度来看它们应该是安全的。

于 2012-06-26T12:13:42.380 回答
0

如果您想将队列与 ThreadPool 一起使用,我建议使用ExecutorService为您结合两者。ExecutorService 默认使用 LinkedBlockingQueue。

http://tutorials.jenkov.com/java-util-concurrent/executorservice.html

http://recursor.blogspot.co.uk/2007/03/mini-executorservice-future-how-to-for.html

http://www.vogella.com/articles/JavaConcurrency/article.html

于 2012-06-26T12:45:40.347 回答