gpt4 book ai didi

java - 线程 "Thread-8"java.lang.StackOverflowError...at java.util.Random.nextInt 中出现异常(来源未知)

转载 作者:行者123 更新时间:2023-12-02 07:48:59 25 4
gpt4 key购买 nike

Exception in thread "Thread-8" java.lang.StackOverflowError
at sun.misc.Unsafe.compareAndSwapLong(Native Method)
at java.util.concurrent.atomic.AtomicLong.compareAndSet(Unknown Source)
at java.util.Random.next(Unknown Source)
at java.util.Random.nextInt(Unknown Source)
at sim.ant.colony.ants.Forager.moveTo(Forager.java:108)

我正在使用一个多线程应用程序( Ant 模拟殖民地),其中我将每只 Ant 创建为一个线程,当数十个线程( Ant )运行时,每隔几圈就会发生上述异常,并且线程被杀死。我使用 Random() 的代码是;

Random rand = new Random();
return adjacents.elementAt(rand.nextInt(8));

这段代码写在线程的本地成员函数中。因此,假设每个线程创建随机数数百次,并且有超过十个线程正在工作。

有人可以帮我解决这个异常(exception)吗?

最佳答案

这并不是您问题的真正答案,而是您遇到的问题、如何跟踪问题以及如何解决问题的示例。

请使用下面的代码:

import java.util.HashMap;
import java.util.Map;

public class StackOverflowExample {

public static void a() {
Map<String, String> map = new HashMap<String, String>();
map.putAll(b());

}

private static Map<String, String> b() {
Map<String, String> map = new HashMap<String, String>();
map.put("a", "a");
a();
return map;
}

public static void main(String[] args) {
a();
}
}

它会立即产生一个 StackOverFlowError:

Exception in thread "main" java.lang.StackOverflowError
at java.util.HashMap$Entry.<init>(Unknown Source)
at java.util.HashMap.addEntry(Unknown Source)
at java.util.HashMap.put(Unknown Source)
at StackOverflowExample.b(StackOverflowExample.java:14)

问题不在于HashMap,也不在于HashMap$Entry。问题是 a() 和 b() 在没有适当停止条件的情况下递归地相互调用,这意味着无限。如果您实际上查看堆栈的下面,您会立即发现该模式:

Exception in thread "main" java.lang.StackOverflowError
at java.util.HashMap$Entry.<init>(Unknown Source)
at java.util.HashMap.addEntry(Unknown Source)
at java.util.HashMap.put(Unknown Source)
at StackOverflowExample.b(StackOverflowExample.java:14)
at StackOverflowExample.a(StackOverflowExample.java:8)
at StackOverflowExample.b(StackOverflowExample.java:15)
at StackOverflowExample.a(StackOverflowExample.java:8)
at StackOverflowExample.b(StackOverflowExample.java:15)
at StackOverflowExample.a(StackOverflowExample.java:8)
at StackOverflowExample.b(StackOverflowExample.java:15)
at StackOverflowExample.a(StackOverflowExample.java:8)
at StackOverflowExample.b(StackOverflowExample.java:15)
at StackOverflowExample.a(StackOverflowExample.java:8)
at StackOverflowExample.b(StackOverflowExample.java:15)
...

您需要找到代码中过于深入的递归。修复它或将其更改为非递归方法。

使用调试器对此有很大帮助,因为您可以单步执行每个方法调用并设置断点(以及许多其他好东西)。

关于java - 线程 "Thread-8"java.lang.StackOverflowError...at java.util.Random.nextInt 中出现异常(来源未知),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10466672/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com