2013-07-22 70 views
1

我对Java中的线程世界比较陌生,需要一些帮助。我使用深度递归算法来构建基于Graphstream(http://graphstream-project.org/)libray的图。但是我遇到一个Stackoverflow错误。我相信我的算法是正确的(我在小范围内测试过)。Graphstream多线程 - Java

我阅读了关于线程的知识,以及它如何提供帮助。我的想法是为每个递归生成一个新线程(可能会达到百万:()。这也会生成很多子图。最后,我将不得不在一个线程中合并所有这些子图。你们认为这真的有助于摆脱stackoverflow问题吗?或者你有任何其他想法对我来说?谢谢!

+0

发布一些代码和异常堆栈。这个错误大多发生在你用完堆的时候,主要是遇到无限循环 – Reddy

+4

线程不是,恕我直言,正确答案是由递归引起的StackOverflowErrors。你最好用迭代代替递归,例如使用堆栈。 –

+0

尝试迭代而不是递归。没有tail-call优化,java不会处理1m递归函数调用。 – Rekin

回答

1

你的想法一般被称为MapReduce。谷歌搜索应该可以帮助你找到样本实施。

由于您的问题是堆栈溢出错误,请记住,您可以将每个递归重写为不会导致堆栈溢出错误的循环算法。

创建大量的线程通常是一个坏主意。只需使用ThreadPoolExecutor服务即可。

+0

谢谢mate ..我也读了很多关于迭代解决方案。但那将是我的最后一枪。递归解决方案当然更性感。 我看了你们建议我的不同解决方案。不过,我正在努力将其应用于Graph上下文。 基本上,对于计算的每个新节点,都会调用递归函数。我阅读的不同教程建议对何时划分任务使用阈值或某种限制。但是为了建立一个图表,我根本就没有任何限制......你们有我吗? – COR

+0

@pro如果您在重写算法时遇到问题,请为其创建一个新的专用问题,告诉我们您到目前为止尝试过的方法,我们将(可能:)帮助您。这个问题是关于一个不同的话题,它应该保持这种方式。 – Dariusz

+0

你对..很抱歉,我将为此打开一个新话题..谢谢! – COR

0

数以百万计的线程是不是一个优雅的方式。而不是线程,启动Runnables java.concurrent.Executor。这样你也可以摆脱Stackoverflow,并且使算法在所有可用的处理器上并行运行。

+0

谢谢阿列克谢。我听到你的声音!这个想法应该是为每100或200次递归创建一个新的线程。我会看看你的建议。我会尽快回复你。谢谢 – COR

+1

@pro的想法是根本不创建线程,创建提交给Executor的作业,该作业具有一定数量的线程并重用。每个作业分组几个(几百?几千?)个节点是一个好主意,因为同步开销会更小。 – Dariusz

+0

真棒..我得到了一个完成。使用Java 1.7这非常简单。我习惯于使用C++进行并行处理 ** @ Alexei **在处理数据负载时,我首选使用Java 1.7中的Fork/Join Framework。我发现了一篇非常好的文章[http://www.vogella.com/articles/JavaConcurrency/article.html],它很好地解释了每种范例... – COR