2009-12-10 83 views
0

我想解决collat​​z猜想。我可以在JAVA中启动一个线程

我使用的是HashMapVector类。我必须迭代循环2 147 483 648次,但在将8,438,409个值存储在HashMap后,我得到一个OutOfMemoryError

我在Eclipse中运行程序并设置了-Xmx1024m选项,但没有帮助。所以,我正在捕获上面的错误,并试图启动一个线程,将控制权交给不同的类并开始执行。

但是,线程没有启动。我已将System.out.println("We are here");语句放入其中,并且它从未打印到控制台。有人可以帮我弄这个吗?

感谢 搞笑

+0

它的一个OutOfMemory *错误*不是例外,异常是可以从中恢复的预期行为的异常。 – pmu 2009-12-10 02:15:26

回答

4

是的,你可以开始在catch块的线程。

但是,如果您遇到OutOfMemoryError,您可能无法启动线程。 OutOfMemoryError意味着堆空间不足,所有线程都使用相同的堆空间(实际上,创建新线程会占用已经减少的一些堆)。

8

你已经偶然发现了异常和java错误之间的区别。错误和异常都是从throwable继承而来,但只是捕获一个异常不会产生错误。然而,错误通常是非常严重的,如果不是不可能从错误中恢复,那么错误通常很重要When to catch java.lang.Error?

12

你不想在你的catch {}块中启动一个线程。这是试图(和失败)治疗症状,而完全忽略了原因。

你想要做的就是停止发生OutOfMemory错误。你的选择是增加堆大小,或者少用它。

+0

我必须说,好吧。 – 2009-12-10 01:40:36

-1

是的,

在catch块中启动线程没有限制。但是,捕获异常时的正常行为是向用户显示,记录日志,并抛出另一个异常,关闭应用程序。

正如其他人所说的,在你的情况下,你试图捕获一个java.lang.Error,它不是一个Exception,并且你没有保证下一行代码执行。

+0

抓拍日志并不是一个好主意。您将最终一次又一次地记录相同的异常。 – atamanroman 2012-08-10 11:16:25

1

你不应该迭代每个值来解决基于collat​​z猜想的问题。我假设你正在试图计算每个值。这是我尝试过的一种方法,但却跑到了同样的地方(尽管我使用的是.net)。

与其试图解决技术问题,我想建议您改变您的方法。

注意:我意识到,我认为(没有理由),您正在尝试解决ProjectEuler.net问题(或类似问题)。如果情况并非如此,我的解决方案可能不可行。

相关问题