HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:% n6 @9 I1 l) N6 z
3 Y) \/ A" }/ n @" K) ?) O* O# H
public Object buildActions () {
5 q3 L" B& Y) B3 L' y/ M, o super.buildActions();
& ]* e; ?9 d$ ]: |
9 [+ j5 h- d, H4 p) h // Create the list of simulation actions. We put these in
, U: I! k6 s8 I+ ^) v! O Q) C // an action group, because we want these actions to be9 U8 Z* w- s: X+ Z9 Z1 X( h
// executed in a specific order, but these steps should
3 u0 j. V# o* ?6 J- x( i8 Q // take no (simulated) time. The M(foo) means "The message
6 `" Z% ]% g- Y6 H // called <foo>". You can send a message To a particular( q/ G2 b# r. W+ Z) K
// object, or ForEach object in a collection.3 v" L. F% P3 t! g1 u5 R3 e
. T4 a' L& u0 |$ w# F" v. E/ X
// Note we update the heatspace in two phases: first run
+ t8 ^8 {4 w+ T6 @& \8 L // diffusion, then run "updateWorld" to actually enact the6 @/ \3 g8 B- T" y
// changes the heatbugs have made. The ordering here is
' C4 a n& |+ E( i b // significant!' [; j7 e6 b7 K+ l: x, y9 Z& c0 r
7 A3 G) I& W0 q+ \
// Note also, that with the additional
2 E+ b; E6 N! w9 ~ // `randomizeHeatbugUpdateOrder' Boolean flag we can
d% }" C% }: s! p3 Y8 q) L5 X // randomize the order in which the bugs actually run2 ^+ s/ H! N+ ^9 ], s$ u2 _, P
// their step rule. This has the effect of removing any5 ]. o) b5 ?% i2 j+ \" |: d
// systematic bias in the iteration throught the heatbug: A8 d# |3 @1 ^, ^/ ]' \
// list from timestep to timestep0 D. v. C8 I4 G8 M5 _8 ^
* E6 c4 n* v7 _8 a' Z
// By default, all `createActionForEach' modelActions have
$ A* x1 f( H& L( |# p( J8 t# K. d // a default order of `Sequential', which means that the
' J |0 b) a4 o // order of iteration through the `heatbugList' will be
$ Z) t! q \* `" ]3 \7 K // identical (assuming the list order is not changed; B5 h4 ~ p5 l5 b' u
// indirectly by some other process).
: r/ U. ]* z: f. _7 ^1 E+ B 1 ]. D* {6 V% C2 Y2 L8 |
modelActions = new ActionGroupImpl (getZone ());
6 S: f* {6 b4 v1 b) U
. P0 M$ W- l2 k6 { try {, b b8 Y* t8 m+ ]! B9 s0 t
modelActions.createActionTo$message0 w: V9 f4 J2 X/ f/ x
(heat, new Selector (heat.getClass (), "stepRule", false));
7 b% k% p8 G3 w ]5 g4 [ } catch (Exception e) {
, _- _5 A( `/ U8 a) t! H System.err.println ("Exception stepRule: " + e.getMessage ());
% z( N; _$ V1 V: C# N! v }2 T4 S) X, q& C, i; s: l/ k2 u
+ u6 u" ]1 \/ t: T' { try {- \5 m5 t; l0 I- m9 c2 g% `2 b
Heatbug proto = (Heatbug) heatbugList.get (0);3 A( I1 P4 K& U% ]7 `3 I4 L
Selector sel =
! ^8 e& Z. b$ Y. c5 q new Selector (proto.getClass (), "heatbugStep", false);
+ _. A% N! C0 k0 T3 V4 e( J5 R) E actionForEach =
+ _1 a6 N* W% y* `1 L' J C4 P modelActions.createFActionForEachHomogeneous$call
8 M# M* ]% X8 ~2 A2 X! w (heatbugList,
! S; y; l2 s9 |' G) ]* w) J new FCallImpl (this, proto, sel,+ ^4 z; b& D/ X) [1 m: s! y
new FArgumentsImpl (this, sel)));, M$ p) R# X. D( d/ f! V& V
} catch (Exception e) {
; Q" L$ j) H5 R" `1 f3 u7 l e.printStackTrace (System.err);
7 a# j9 r7 z0 _8 h" _! ` }
4 P! R' O, }8 }" w( G8 E7 {
B+ _, E: A( N, l! v# T- O syncUpdateOrder ();
" `( ^2 @: v5 z% N7 z. f& f/ K! y2 ]3 ~
try {
9 p: H& T ?! t9 [8 y. l modelActions.createActionTo$message , X) L' e% j: @+ _4 _
(heat, new Selector (heat.getClass (), "updateLattice", false));
$ a+ I8 ^) t# T% ^+ G } catch (Exception e) {
8 Y- V" k& h8 N; B System.err.println("Exception updateLattice: " + e.getMessage ());
' q; }& {/ F, ]+ R+ l& H. D) l }
, A: \! o K3 S- g# z
: m c; a$ e: p' Q5 ~9 Y$ ` // Then we create a schedule that executes the
) R, N2 |4 u. \7 I0 n3 X // modelActions. modelActions is an ActionGroup, by itself it
3 N* f; r* Y; o! H! C$ i // has no notion of time. In order to have it executed in8 w' V* f2 w' h: B5 f; h4 N4 t, |
// time, we create a Schedule that says to use the
0 q; Q- ?, D( k9 m# h // modelActions ActionGroup at particular times. This
6 F$ y) J `6 G$ n3 V ~ // schedule has a repeat interval of 1, it will loop every
. F# |( c A; k' a8 b* X8 g- i& u // time step. The action is executed at time 0 relative to1 {, v8 D6 {! E& i; y" N: Z
// the beginning of the loop.$ ^$ ^7 E5 m9 M: u" \
7 E# B5 F6 J, q9 P4 S. k2 i! I# Z+ f: O // This is a simple schedule, with only one action that is
% [5 D. l; K' x // just repeated every time. See jmousetrap for more: o9 W; `" q5 _. Z1 f3 C w
// complicated schedules.9 X; |, X3 b6 {
6 x1 m8 p/ s$ E- H, u% u1 O& o
modelSchedule = new ScheduleImpl (getZone (), 1);! o! U2 n4 T) Y5 o) q! ^
modelSchedule.at$createAction (0, modelActions);
1 \8 R3 X; z" ?: F , V i8 }" G) A1 E7 U+ w3 u
return this;
' z* A! O' T% `! r } |