下面是我编写的代码的简化版本。基本上有一些对象接收消息,对它们做些什么,然后传递它们(它们实现IState
)和发送消息的对象(实现ISend
)。问题是我得到非常深的堆栈跟踪,最终导致堆栈溢出。我怎样才能解决这个问题?如何限制堆栈深度
public class StackTraceMain {
private IState origin;
public static void main(String[] args) {
StackTraceMain s = new StackTraceMain();
s.prepare();
s.go();
}
public void prepare(){
Sender sendTo2 = new Sender();
Sender sendTo1 = new Sender();
origin = new State(sendTo2);
IState state2 = new State(sendTo1);
sendTo2.setTarget(state2);
sendTo1.setTarget(origin);
}
public void go(){
origin.update(new DataTuple(0));
}
private class State implements IState {
private final ISend sender;
public State(ISend sender) {
this.sender = sender;
}
@Override
public void update(DataTuple data) {
int num = data.getInteger(0);
num++;
System.out.println("Sending " + num + ", depth: " + Thread.currentThread().getStackTrace().length);
if (num < 1000)
sender.signal(new DataTuple(num));
}
}
private class Sender implements ISend {
private IState target;
public void setTarget(IState target){
this.target = target;
}
@Override
public void signal(DataTuple data) {
target.update(data);
}
}
}
需要很长时间才能发现异常情况,因此需要我一段时间才能发布。为什么要使用不同的事件总线帮助? – Johnny