多线程是队列合同的一部分吗?

时间:2012-06-26 11:54:49

标签: java data-structures queue

目前我的算法有点像网页蜘蛛或文件搜索系统 - 它有一系列要处理的元素,处理元素可以导致更多的元素。

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

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

list of Queue interface implementations

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

4 个答案:

答案 0 :(得分:3)

使用单个线程的java.util.concurrent结构基本上很好。

需要注意的主要问题是阻止通话。如果你使用像ArrayBlockingQueue这样的有界大小的结构,并且你在一个已满的队列上调用put方法,那么调用线程将阻塞,直到队列中有空间为止。如果您使用任何类型的队列,并在它为空时调用take,则调用线程将阻塞,直到队列中有某些内容为止。如果你的应用程序是单线程的,那么这些东西永远不会发生,所以这意味着永远阻止。

要避免put阻止,您可以使用像LinkedBlockingQueue这样的无界结构。为避免阻塞删除,请使用非阻塞操作 - remove如果队列为空则抛出异常,poll返回null。

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)