HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:6 x# x* t5 Z: ]2 e- Z( A% {4 t
! L" ]- D6 M* ]. o n
public Object buildActions () {
0 l6 a8 ?; ~7 b3 _ super.buildActions();
5 G" [- {! A2 d; }: `% _
1 V8 B) n% E# G7 Y5 c: W0 h // Create the list of simulation actions. We put these in& _7 f ~7 ~# X3 ^; j0 n7 u
// an action group, because we want these actions to be6 p7 u, s8 o' D1 X4 d0 L
// executed in a specific order, but these steps should
+ g% r; L3 t$ X) S // take no (simulated) time. The M(foo) means "The message8 g5 O+ r( X: v
// called <foo>". You can send a message To a particular
( N# V+ ~1 X5 w. m, g8 ]3 D // object, or ForEach object in a collection.0 W, d r, M6 `! d6 ?" K
m, J0 {3 C/ s+ c: D1 h- c // Note we update the heatspace in two phases: first run
4 C9 X; j2 q" i$ Y% a // diffusion, then run "updateWorld" to actually enact the! N' k) m' i3 ~
// changes the heatbugs have made. The ordering here is
Q! a, d8 O+ [! ?- m- r& s( V // significant!
, P+ N x# `: F0 a1 _ $ K' n" i- {' T: x+ ]6 ]8 c
// Note also, that with the additional
& ]& b, x2 _$ P( B/ y; D // `randomizeHeatbugUpdateOrder' Boolean flag we can4 A5 N. i: \% ^* t# {8 k- p, }
// randomize the order in which the bugs actually run
; k6 x" l2 Q! Y9 ? // their step rule. This has the effect of removing any3 Y( P: o. L! a" l* o( D
// systematic bias in the iteration throught the heatbug
+ x9 ~1 M* m% g. K // list from timestep to timestep
1 C n5 t+ [; w4 A; V6 w5 u ! O$ S/ Y/ R) ^" N& q: l" j
// By default, all `createActionForEach' modelActions have8 P$ H3 D% g* X" A
// a default order of `Sequential', which means that the( C5 u9 B0 p6 ]7 m7 m- ^
// order of iteration through the `heatbugList' will be. p3 ]: b+ Z2 g: e4 E7 L) N: W1 K
// identical (assuming the list order is not changed
& ~( V, z4 A/ \- `& j // indirectly by some other process).
9 i* }, k$ u j
! ^$ {# M% X4 z, v9 t( G modelActions = new ActionGroupImpl (getZone ());
9 O3 N3 E- e# ]
' o1 ^' B* r0 \9 |2 X try {8 V |8 S: t" l9 x
modelActions.createActionTo$message
; N7 @' H1 Q% w. p# P" k$ {0 N (heat, new Selector (heat.getClass (), "stepRule", false));' C& Z( `5 W+ L& R
} catch (Exception e) {
' t3 o1 O' K# @0 E' ^/ m# V System.err.println ("Exception stepRule: " + e.getMessage ());
% c" N/ S7 D- j' d# M; j; g }
5 ]4 P; ~: H& a: K0 r' F/ W D2 V( X0 {7 x& y
try {1 d1 |5 X3 w+ C0 ]* P" l
Heatbug proto = (Heatbug) heatbugList.get (0);8 [, Y; D& P0 L( T
Selector sel =
4 F3 r. K6 U* F- M new Selector (proto.getClass (), "heatbugStep", false);
* K2 M6 u: f3 A! v9 C, f8 Z actionForEach =3 J+ g! p: r% E. X, m: T4 P
modelActions.createFActionForEachHomogeneous$call
( f8 l, H5 l e- k4 q; J$ s (heatbugList,
8 L6 V8 n0 D: J& j7 O% ] new FCallImpl (this, proto, sel,
1 U& O' e% K+ o: [' N6 @ new FArgumentsImpl (this, sel)));* K6 m3 c" X( V& m* q
} catch (Exception e) {& f. }7 X9 a3 }! L" i
e.printStackTrace (System.err);: i0 i! ~ P9 \9 K- |" D
}! ?* a3 n; v. m) c
+ x6 Q3 v! e/ X syncUpdateOrder ();
' c" v! ]* M, G$ o: _1 Z2 h
! I! \+ d0 s, \3 O( R4 b& a5 r try {
$ A2 M4 Z4 X/ n modelActions.createActionTo$message
1 P1 D- U, A3 k, h% J A (heat, new Selector (heat.getClass (), "updateLattice", false));' } N* \& B. z: u" i
} catch (Exception e) {( y6 O+ `! _# k" `; l
System.err.println("Exception updateLattice: " + e.getMessage ());
% ^ X2 k, D, ~% C* X& {# ]2 P* @ }
$ K9 \% v- E4 E" M' p' X/ S/ ?6 F ; ?2 V3 L! q3 M+ o- M, d
// Then we create a schedule that executes the" |& S0 D1 B d+ G) K* d
// modelActions. modelActions is an ActionGroup, by itself it* l# G5 L, ^# h3 V
// has no notion of time. In order to have it executed in* t0 y" G3 Y; c( q
// time, we create a Schedule that says to use the; d) H, Q; \9 E$ ^) d! }# e
// modelActions ActionGroup at particular times. This
6 X$ Y2 K1 D" F; e2 \* \$ a // schedule has a repeat interval of 1, it will loop every- B; q% b7 h" B! H
// time step. The action is executed at time 0 relative to6 f* @1 Y, O' @( j$ K
// the beginning of the loop.! k6 o5 r0 b& e1 j" e. b3 k0 }* a5 ~; |
. p5 G8 Q9 @& g8 t% x# q // This is a simple schedule, with only one action that is
( B. d0 [& i2 x/ ~ // just repeated every time. See jmousetrap for more
; m! Z& Z6 I# f4 ^3 U( M // complicated schedules.
9 p( _; B% H2 v1 e s# _
1 d0 a1 l3 `9 W- R- z0 Q+ B" g6 n modelSchedule = new ScheduleImpl (getZone (), 1);6 w+ U9 |* C4 @4 B
modelSchedule.at$createAction (0, modelActions);! h" ^# p8 `( S
% Y; e8 L3 j5 j) I. ]) X return this;! ]) ^. i# i( Q! M) b- d* X
} |