HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:2 {0 k/ V% r, C2 x2 q0 J
; A+ c, X# G) t' v public Object buildActions () {
+ C2 n8 B6 _& i super.buildActions();* b( C8 u' G4 v- R
7 v9 ]0 \2 r1 a; v6 v0 E // Create the list of simulation actions. We put these in% b8 ?, p' r: i8 c/ `$ s. A$ ?
// an action group, because we want these actions to be
, i) u" F; L& F& z7 |9 j // executed in a specific order, but these steps should$ c3 W" u, Z* K- n4 c1 e2 I
// take no (simulated) time. The M(foo) means "The message9 i: @7 p b$ U
// called <foo>". You can send a message To a particular) ` T5 h7 D7 _( F3 B
// object, or ForEach object in a collection.
2 Y; \8 M: U, e( b8 w. U! O3 s
% U& R+ @( D0 A; A, i7 p g4 F7 @# Z2 Z // Note we update the heatspace in two phases: first run
@ D7 i8 a/ L$ K5 ]0 q // diffusion, then run "updateWorld" to actually enact the
( T' ?0 `8 v' I! ^1 I# F; s // changes the heatbugs have made. The ordering here is
4 p9 R9 w& i4 T' `' m- ] h // significant!. p! y, Y. v; c( B- M6 ~
* \9 r( I& P& f' {6 w i+ K f
// Note also, that with the additional% {0 V' O) ^& A! T& F' S+ y* ~
// `randomizeHeatbugUpdateOrder' Boolean flag we can
: @: F9 ~; H. k3 Y. z- c1 C // randomize the order in which the bugs actually run
# j* T5 E5 e: B! ~ // their step rule. This has the effect of removing any6 F o8 U( T- s
// systematic bias in the iteration throught the heatbug4 F3 V+ @( p+ I2 `
// list from timestep to timestep9 S* f: \0 H' Q
- r- p- I+ b5 f
// By default, all `createActionForEach' modelActions have
1 |' O. a& ~7 C. ] // a default order of `Sequential', which means that the
) e9 E( ^8 v5 M) x# i // order of iteration through the `heatbugList' will be& @' d R5 o1 o8 e5 {' q
// identical (assuming the list order is not changed
' s* w7 f& K. l+ d+ G) M: i // indirectly by some other process).+ U/ b Y$ [) l( w ]5 g
7 D1 J9 P2 c! ~- G
modelActions = new ActionGroupImpl (getZone ());
% E" _6 t# d2 m4 O2 U
~6 W; J3 ]8 X# |! [( v* u U try {' X% U7 s' \/ e
modelActions.createActionTo$message( G8 |0 L- t$ Y' |* k3 x
(heat, new Selector (heat.getClass (), "stepRule", false));
+ `. I/ l9 z) T8 K4 d. V } catch (Exception e) {
) P) ?/ z% [7 h0 N, M System.err.println ("Exception stepRule: " + e.getMessage ());8 M9 J3 d' @+ C% E
}
) K% {9 O. j: V' I! H% s4 l' e, E v" x
try {8 i9 |4 X- |. e* F- B+ \
Heatbug proto = (Heatbug) heatbugList.get (0);
2 n, C4 m" h: I0 O. `+ f h Selector sel = ' I2 w2 F9 N5 j) |
new Selector (proto.getClass (), "heatbugStep", false);
1 G, H" v& s" e actionForEach =
- e0 E' Z5 v4 s; B modelActions.createFActionForEachHomogeneous$call, @" u% S2 q. |9 t# {, p* s
(heatbugList,3 {1 |% c' M# y9 G
new FCallImpl (this, proto, sel,* x& \, p% J9 R9 J; p/ o4 D
new FArgumentsImpl (this, sel)));
: }# X5 I! {9 x1 h* _9 a1 ~9 z9 D- [) b } catch (Exception e) {
1 ?- t* X [: L: n n e.printStackTrace (System.err);0 V3 F/ y3 q5 G* g5 v9 Q8 ~0 ]' j
}' ]7 a2 h' }4 H7 F0 H1 Q) y
' n* r; ~$ x- w$ j& l) o
syncUpdateOrder ();
% S) R; i4 n" |5 m3 g' D1 G. ^2 i; j: y5 z( \4 m3 V1 k5 N
try {
+ @/ E& |: b7 W; ]& j& V modelActions.createActionTo$message
7 ]2 ]( S8 e2 x: w1 f$ l3 Q) {- ^ (heat, new Selector (heat.getClass (), "updateLattice", false));
1 w# h- ], R, i% b5 K8 ? } catch (Exception e) {3 D1 F. l6 u6 y7 H- B
System.err.println("Exception updateLattice: " + e.getMessage ());
6 n+ o: A8 L4 D: k2 E }# B; Z: W% k# V# K$ u8 o6 T1 ]2 \$ e
- b: b7 w0 h1 x
// Then we create a schedule that executes the- e* B9 {5 R0 D" o
// modelActions. modelActions is an ActionGroup, by itself it% B& b. Q: m' B. I# Q
// has no notion of time. In order to have it executed in: r9 J! g0 n7 o; |" e
// time, we create a Schedule that says to use the8 I/ x- ^, Z) Z. u5 l
// modelActions ActionGroup at particular times. This, g6 F" ~8 f& \* |1 e
// schedule has a repeat interval of 1, it will loop every! W; r/ \2 P& G Q' [1 v
// time step. The action is executed at time 0 relative to0 i5 y' |3 X4 F3 D& I3 J
// the beginning of the loop.
& @: {( w/ e i4 l5 g/ C6 }
; P6 Q; [4 i) a- v! _2 p // This is a simple schedule, with only one action that is
; L# d: {' u7 e5 e5 j // just repeated every time. See jmousetrap for more
. n& c+ C# l# n* S5 u // complicated schedules.
' R( k w( ^# L; U( [
' v, Z, ~: L. U0 h' s6 \4 _, H modelSchedule = new ScheduleImpl (getZone (), 1);1 N2 ? b; S1 d
modelSchedule.at$createAction (0, modelActions);$ h% E) `( r6 h5 {8 T0 X- U/ V. ^
& E9 s/ V. N, f; C return this;! L. ~ a5 i5 O3 f% x0 A7 c# G* P. l
} |