目前我的算法有点像网页蜘蛛或文件搜索系统 - 它有一系列要处理的元素,处理元素可以导致更多的元素。
然而,这个算法是单线程的 - 这是因为我从数据库中获取数据并希望一次只有一个数据库连接。 在我目前的情况下,性能并不重要 - 我这样做只是为了可视化目的,以便简化调试。
对我来说,使用队列抽象似乎很自然,但似乎使用队列意味着多线程 - 据我所知,大多数标准java队列实现都驻留在java.util.concurrent包中。
我知道我可以继续使用支持 pull 和 push 的任何数据结构,但我想知道在这种情况下使用哪种数据结构更自然(在单线程应用程序中使用队列是否可以?)。
答案 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)
如果你想使用一个带有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