HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:) y3 M+ u! J% x3 J1 @4 \
# J+ I; W5 N9 g* Q4 e$ p public Object buildActions () {
0 K& O: g6 J& f3 r8 e, J! y super.buildActions();, U; \/ o# {! R! [, w7 X+ A: d
5 @7 o5 A. W1 q& L& n: ~ // Create the list of simulation actions. We put these in/ Q+ d8 H" p, U& ]6 W1 `; |
// an action group, because we want these actions to be" d7 q) K3 U j! }8 Y+ {; {5 L
// executed in a specific order, but these steps should
: J5 t: d! G2 D' S // take no (simulated) time. The M(foo) means "The message
* V6 p5 X5 y" u6 L // called <foo>". You can send a message To a particular" d9 `% q6 y5 R3 H8 ]
// object, or ForEach object in a collection.
( ^' R/ A$ F) a4 X; ]* m {
! S% ^$ ^9 `! K. l( [ // Note we update the heatspace in two phases: first run
9 M% Y* S9 _+ F% J" w1 H* @ // diffusion, then run "updateWorld" to actually enact the
; _: O" G/ O/ f7 `- d% V, V7 n* M // changes the heatbugs have made. The ordering here is$ h8 W6 u6 p/ L/ f* p: ^
// significant!
" Y& d% O; `6 a! a0 ]" ] / l" G$ c0 }( {1 T
// Note also, that with the additional
: n- q! d$ S1 | // `randomizeHeatbugUpdateOrder' Boolean flag we can) U) }0 N0 C" ^# T: q/ a
// randomize the order in which the bugs actually run
$ i( {" l2 [5 o) A V7 p$ R7 ~ // their step rule. This has the effect of removing any
8 ]) Q7 \# m3 _ // systematic bias in the iteration throught the heatbug }9 z* a' `9 n2 A* o4 u( z
// list from timestep to timestep' X4 h6 j! R9 n c5 j* m
" o9 C* S" J" R+ M
// By default, all `createActionForEach' modelActions have
# Q" k2 s. r1 M l/ k // a default order of `Sequential', which means that the- ]- J& y3 o- `! N0 i
// order of iteration through the `heatbugList' will be7 I6 Q, P; C/ t/ X
// identical (assuming the list order is not changed
3 u8 P1 \) M) l; f$ j // indirectly by some other process).
- F: l9 M9 K7 D8 a# {( r
7 Z$ s6 `" X5 B0 |' q/ P modelActions = new ActionGroupImpl (getZone ());
& ~) Q6 f5 e0 U0 l
; ?* ], O" `% T' i/ t+ | try {+ U; Q0 S0 k. H+ ~& u# `
modelActions.createActionTo$message/ X" K6 e: I' t4 D' [- M
(heat, new Selector (heat.getClass (), "stepRule", false));2 n) @5 z) h( V4 Q0 S
} catch (Exception e) {
9 F. h A: G" T% c& m1 D7 _% r0 k8 ^ System.err.println ("Exception stepRule: " + e.getMessage ());! V, E4 T5 z+ E2 G( A+ r
}) g7 O7 n; P( \4 G8 i
0 f2 E& k/ c! C' i5 y9 D2 y try {
( u! \& Q( a& g3 k( P' a, s' {) u Heatbug proto = (Heatbug) heatbugList.get (0);' S, P1 a3 r& z2 K) m4 {$ l* B
Selector sel =
- g5 X8 T/ }* @& c4 f new Selector (proto.getClass (), "heatbugStep", false);
. v* N+ F! ^, y+ T7 L# K0 k1 n actionForEach =
2 g3 M; F L& O |! [2 P) @ modelActions.createFActionForEachHomogeneous$call
7 \" f& J. o9 Q (heatbugList,
6 q: ?; ~; l4 w( Q) N& g new FCallImpl (this, proto, sel,
* u$ C+ G- t# r* m1 U new FArgumentsImpl (this, sel)));& X7 ^5 ~: A. [5 h' P$ o
} catch (Exception e) {2 p9 y* @8 I! C7 i
e.printStackTrace (System.err);. k6 ~- P, i" L2 |0 H" G! t
}
# T( k: ~( D6 s$ _
8 F7 s R4 Y. |0 g# x syncUpdateOrder ();
/ C3 }6 {1 q6 i# v2 C8 f
6 F2 a5 h# w: N- s6 L3 |! N- S try {
6 @8 E& z$ n/ f8 j" }& `+ ` modelActions.createActionTo$message
9 f9 M* _& h3 _% V) N (heat, new Selector (heat.getClass (), "updateLattice", false));
( {, k" I) ]+ y5 k6 D- P( L } catch (Exception e) {1 W9 N* r4 T' Y {6 }
System.err.println("Exception updateLattice: " + e.getMessage ());8 y# B/ X/ G& Y% Z- ~6 B
}' d" T4 `( d! R1 ]2 ]5 w7 {: c: z' n
# A. \, T5 p+ k; a- h3 r+ T0 Y5 H+ v // Then we create a schedule that executes the
0 d) D$ S+ J. A) I: T // modelActions. modelActions is an ActionGroup, by itself it
3 n. g/ V! i! Y$ Y! h9 M$ K // has no notion of time. In order to have it executed in
D2 N: d# i& N% x, W( | // time, we create a Schedule that says to use the
% ^ w% @8 P3 f6 @5 v4 w // modelActions ActionGroup at particular times. This
# a' J" `' ]( x( B2 `; p // schedule has a repeat interval of 1, it will loop every; g7 }* G. s$ H n
// time step. The action is executed at time 0 relative to
, [7 @7 k! @1 X. w6 x // the beginning of the loop.; ]) M/ S D6 M+ q0 G
* O7 `$ h* _$ d' X // This is a simple schedule, with only one action that is
# `# W& b; }6 H t0 v3 B // just repeated every time. See jmousetrap for more5 l7 {( y" r6 A4 U! w; \
// complicated schedules./ D' _) R. V v- }2 }6 H
^5 a4 W( Z5 B modelSchedule = new ScheduleImpl (getZone (), 1);5 ^4 P5 z$ d+ y0 e% f0 `7 B
modelSchedule.at$createAction (0, modelActions);7 Q! N T6 ~1 i
- k# X; `6 r2 ^2 p1 ?1 B# t/ C% l
return this;
9 v4 o( U5 T1 M c } |