HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
+ o1 e" h% {+ @3 j
; z3 _0 w$ E' u0 m public Object buildActions () {
( j7 |2 M3 ~2 f7 d) I$ ? super.buildActions();
! v+ o, g( }+ S5 V5 c
* \5 q/ p% X' g // Create the list of simulation actions. We put these in
! `0 W% C1 D7 A* a) E& V B // an action group, because we want these actions to be( U' J/ [% P d! B2 n( f5 Z/ Z3 Y! A
// executed in a specific order, but these steps should
7 j0 {; D# v8 u+ H // take no (simulated) time. The M(foo) means "The message) o' I* C$ B% W/ L
// called <foo>". You can send a message To a particular* z0 `: [) t% q" `8 H; O |* G; {
// object, or ForEach object in a collection.
3 L" r! G4 C; Z( G* N3 `( A8 } 0 Y3 o; [) H2 h5 m) L9 e
// Note we update the heatspace in two phases: first run
) {1 X% s2 y1 W // diffusion, then run "updateWorld" to actually enact the4 A" M2 x2 \5 s2 | d5 E: Z% p
// changes the heatbugs have made. The ordering here is$ } @& o% Q, j" A; H+ j. r
// significant!0 B9 x: E# W, }# M! F
. U0 j$ O# n/ f3 }7 L9 t' E4 X // Note also, that with the additional
5 s! b M. \% P- o. h // `randomizeHeatbugUpdateOrder' Boolean flag we can
8 M6 ?/ y/ m6 m: l/ \ // randomize the order in which the bugs actually run
! z6 ?; K) [* M! M) O6 n // their step rule. This has the effect of removing any
! U& P: Y( J& A) A b! | // systematic bias in the iteration throught the heatbug
$ a4 G3 X/ b: E2 o2 f+ ^7 C6 \/ C$ I6 a // list from timestep to timestep
) i C* K O! o2 o 6 @: V0 J. A0 x5 b% X- N: W
// By default, all `createActionForEach' modelActions have
* H: t5 x- ]+ {0 u& L1 p; c% j, a# ` // a default order of `Sequential', which means that the9 w5 S1 x. z$ ?0 a% y a; z7 o, e5 @
// order of iteration through the `heatbugList' will be" v& Y: R' ` v3 V! f# d
// identical (assuming the list order is not changed
* ^3 e* [5 s a // indirectly by some other process).0 i% d- s R( c, n# e# E1 N1 b
; U+ g1 S2 E: J( f modelActions = new ActionGroupImpl (getZone ());
9 M$ u" c+ J5 b2 f" G- d) e5 D1 U! T. q4 n0 H( a3 I, {
try {4 |1 S# s% A$ O0 b9 v
modelActions.createActionTo$message
, [" V9 R m# A( s$ @0 d: Y$ }4 W (heat, new Selector (heat.getClass (), "stepRule", false));
( Q4 m4 `, p( P6 O% r } catch (Exception e) {
( ]6 M) @: j" `; I r6 }3 } System.err.println ("Exception stepRule: " + e.getMessage ());
' ?& w8 m, r" ^$ ?# U7 L }
7 u" K/ C9 A7 T9 s4 U1 ]) j: F" p5 e* Q$ f0 v. v$ s/ Y
try {1 @. ~: X \, n6 M
Heatbug proto = (Heatbug) heatbugList.get (0);, q/ X- {$ Q4 P, `* V
Selector sel = / O' b, E( u9 K8 X8 D" j1 P
new Selector (proto.getClass (), "heatbugStep", false); @( _' T4 y9 x9 l" A
actionForEach =
; P$ M; W" b# j4 c3 A3 ]! B( J5 v& A modelActions.createFActionForEachHomogeneous$call$ C3 _4 {3 W3 T) u
(heatbugList,
; l) y6 u0 V' R! s/ _7 ~ new FCallImpl (this, proto, sel,& Q* h7 ]5 a1 m% Y
new FArgumentsImpl (this, sel)));$ L( s* g0 N" p0 `/ f3 N
} catch (Exception e) {
' n3 g4 M6 M6 F5 `. y3 Z( H; P e.printStackTrace (System.err);
! r8 c; g- d0 `$ j% n' A r }9 B- X5 L: ?8 f) V
) s5 `5 J8 S( S& X) |' u syncUpdateOrder ();' f$ Q1 \9 p* l
! c7 g! b6 I) y9 ^7 L/ f try {
' u- b! P o" x: L8 g7 f modelActions.createActionTo$message ' a/ g8 A% ^. i" r
(heat, new Selector (heat.getClass (), "updateLattice", false));
$ Z% N5 H8 f2 K" S" o, e- y' x8 y } catch (Exception e) {" h! v* ]0 W' n5 t% G8 l
System.err.println("Exception updateLattice: " + e.getMessage ());
T+ i8 y; E3 N }
. m! v, e; H$ ]$ C! a# j; u
& f2 d. W+ M5 x // Then we create a schedule that executes the6 i+ Q3 Q; D7 q2 V6 F
// modelActions. modelActions is an ActionGroup, by itself it% s/ M( W2 a7 Z7 T; P
// has no notion of time. In order to have it executed in
7 z n8 t, m& F. {) i2 l // time, we create a Schedule that says to use the+ Q& X1 o8 ?& j5 o* X& P
// modelActions ActionGroup at particular times. This
$ a& B" Z+ Z0 X, ~- y' J- E# K // schedule has a repeat interval of 1, it will loop every# {& f. [9 a, Z7 i0 r5 X8 h- F% E
// time step. The action is executed at time 0 relative to2 X+ H' \1 A4 I* U0 }( M3 |
// the beginning of the loop.
# D& t/ U3 ^ V* z6 i' g: R: e
/ Q* w* [6 r$ I8 y1 N4 V" o // This is a simple schedule, with only one action that is
0 X9 f3 N1 o( x4 s# D* \ // just repeated every time. See jmousetrap for more
) {" J/ a2 n3 f) v7 q. U // complicated schedules.( I2 m! z9 o* W$ U! |9 O, y
0 [% z: r4 R+ h1 a; b* o, B& j5 @; }9 c modelSchedule = new ScheduleImpl (getZone (), 1);7 F, \$ _8 ~" r* k' F. q! e
modelSchedule.at$createAction (0, modelActions);
4 Q9 m' K: w0 h) J
0 {# |% h% c. v return this;
* v% G0 r7 \* F V; ^' [ } |