下面是我編寫的代碼的簡化版本。基本上有一些對象接收消息,對它們做些什麼,然後傳遞它們(它們實現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