HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
. L. |; |8 F' o* |
7 m. u4 D5 i# N7 q0 _7 I public Object buildActions () {5 F9 M7 J- d7 r
super.buildActions();
4 R6 N( L5 l- X2 c0 {6 w8 U, A* U% B - W" k; t- z" q) G1 \4 h: y
// Create the list of simulation actions. We put these in& d4 e; X7 \6 u* s7 @9 R
// an action group, because we want these actions to be7 P- ?/ W* c2 X4 W" E4 G' S' T/ Z, A/ L
// executed in a specific order, but these steps should3 F- Q. \" P& W" s
// take no (simulated) time. The M(foo) means "The message
- n( _2 e9 V1 p. ] // called <foo>". You can send a message To a particular
; b. [2 U2 n$ i$ k# Y: _ // object, or ForEach object in a collection.
3 k+ E8 B P; A# N) D A4 G: A : D7 P$ Y, B1 N8 d* `# E
// Note we update the heatspace in two phases: first run6 k6 q% L2 F0 | m2 i7 Y1 b
// diffusion, then run "updateWorld" to actually enact the: B5 _# W* l8 N- V
// changes the heatbugs have made. The ordering here is! v% z4 u% H8 g+ n# A* b. Y+ r& E
// significant!
7 }! M% {3 Y% K& n6 e* x& A7 X
( d" ^# n. X/ N // Note also, that with the additional- j: a% M7 `9 ~! g* F$ T+ m% }
// `randomizeHeatbugUpdateOrder' Boolean flag we can
9 p' z2 A. Z3 \# f$ I$ x; T // randomize the order in which the bugs actually run: a9 O. T6 L1 Y- T/ B& v6 n6 u
// their step rule. This has the effect of removing any' R6 A# X j& D" Y5 w7 Y
// systematic bias in the iteration throught the heatbug% G, W( e3 Q6 ^& M4 F$ H) G J3 {5 A
// list from timestep to timestep
! h. l4 Q" T9 V7 e( I4 n
) l" k* _2 S+ u+ c* C5 V( O* t; v) @% y // By default, all `createActionForEach' modelActions have
# A9 G6 f) U. |2 V1 K8 \ // a default order of `Sequential', which means that the
% g8 M1 T- e1 U5 s/ h // order of iteration through the `heatbugList' will be
) Y1 h0 S; n a& H0 `: b0 U" L' y // identical (assuming the list order is not changed
5 A) p# Z) l6 Y( P // indirectly by some other process).
, h0 e) l" E6 r7 z8 L, X a2 I
9 q9 c! O' {, N3 ?8 q modelActions = new ActionGroupImpl (getZone ());
# c+ [; M* W3 o9 j$ W$ b! v# \/ q- f0 s8 |# `+ s
try {
) B/ a: K* z' i) S( x modelActions.createActionTo$message Z2 y' S( O" A, R
(heat, new Selector (heat.getClass (), "stepRule", false));+ Y$ N9 x; p9 F& |6 J: i9 O
} catch (Exception e) {
3 { p$ X! |. g8 j+ o System.err.println ("Exception stepRule: " + e.getMessage ());2 S2 o: W; o$ O6 B1 X
}7 ~7 ^3 }* F/ r7 S5 N: b7 d: E P
2 j7 }) o0 Q% c! j+ v+ U3 }3 h try {3 ^2 z2 `/ b G, [6 P- L l
Heatbug proto = (Heatbug) heatbugList.get (0);
' a) o7 i! p. I( L" D/ Y o4 Y' f! O Selector sel =
3 t. j7 ]$ M* @* y6 o new Selector (proto.getClass (), "heatbugStep", false);: a. G7 | o6 m/ S# ^) I
actionForEach =
& m4 d X3 p* K/ l0 t6 \ modelActions.createFActionForEachHomogeneous$call
4 ^: S8 P0 _) |! @ (heatbugList,* k, Z5 e' y4 X# Y& \# Z; \( U
new FCallImpl (this, proto, sel,
' D/ I/ \) g g% y2 G! d4 s new FArgumentsImpl (this, sel)));1 d N, z! A. Y) }$ x/ B
} catch (Exception e) {
0 c1 q0 N+ I7 \" J( p9 \! M e.printStackTrace (System.err);# G/ L; k# \- R$ X6 M% q
}
9 A$ T9 C3 g: ]' ?
" y; z7 P; z) b, e: W syncUpdateOrder ();
6 l' X1 H7 p: Z4 n- S" {2 n2 F8 W2 ]) S
try {" I" c0 l/ J/ u, D- e8 A ?
modelActions.createActionTo$message
* v3 {- L( l5 d! s8 N# n (heat, new Selector (heat.getClass (), "updateLattice", false));+ L4 M% C0 h& S( {0 j8 A
} catch (Exception e) {; D1 z! ?6 ~& m! I% Y
System.err.println("Exception updateLattice: " + e.getMessage ());% x4 m$ y. I) w8 y. M3 t
}
& }- S8 _0 Z" ]* N- o1 t0 L5 [7 G
8 a" A+ y9 L7 O // Then we create a schedule that executes the2 X1 h6 I9 z) R# |+ c
// modelActions. modelActions is an ActionGroup, by itself it
/ S7 |- O. f% e( a/ } // has no notion of time. In order to have it executed in
3 l9 Y. `& @3 k: @3 Z- p$ Y // time, we create a Schedule that says to use the
0 A: w3 v0 n7 ]: |2 B# W5 A // modelActions ActionGroup at particular times. This6 q& E$ s) i- U" \2 M
// schedule has a repeat interval of 1, it will loop every
5 r/ k" a* J" S3 W4 B* H1 e9 a // time step. The action is executed at time 0 relative to
4 v- b% o( O8 z# |" b // the beginning of the loop.4 R" O3 I% k& a' B6 U
B y |3 X0 Y* H `* l // This is a simple schedule, with only one action that is
, s1 N( V3 K) h$ W // just repeated every time. See jmousetrap for more z0 P, G) I4 ^& \. @! f% R, r9 m
// complicated schedules.$ c2 p( b$ e2 G& \$ {4 v5 X
' _& q5 J& N: c3 c' @! {2 ~% o
modelSchedule = new ScheduleImpl (getZone (), 1);
* f" u* @" G& g/ H! y# |1 D modelSchedule.at$createAction (0, modelActions);
5 o% H) F3 D% ~ 2 W- ^% C: K: V& {1 t* b
return this;
. F, c) v1 ?0 R } |