HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:5 s5 R9 o3 ~# R) h* S
& K; g9 p) |& Q1 d public Object buildActions () {
& @6 V& p" e0 g3 I4 l- c super.buildActions();/ l9 ]4 V9 J' a ^) H9 T# i0 ]
J" i5 g6 f& \- g2 e- J1 \ // Create the list of simulation actions. We put these in
% }4 j0 ?" }/ |3 J9 }; r* \ // an action group, because we want these actions to be
& l/ w: O3 W! O+ Y1 g // executed in a specific order, but these steps should3 |7 n4 D) H L: S* X, B2 W
// take no (simulated) time. The M(foo) means "The message
- a. l+ f* V' Q! \$ \# r- r // called <foo>". You can send a message To a particular
+ T: i! M% a4 Z& d, ~" J // object, or ForEach object in a collection.
. _, N2 A# w1 V 0 x& U, y4 Q. l
// Note we update the heatspace in two phases: first run
: w% z' K9 Z& L, n) x: v1 X // diffusion, then run "updateWorld" to actually enact the
5 F# _; Y0 G7 r // changes the heatbugs have made. The ordering here is
0 H$ J4 K& E- G // significant!' g _& Z1 F- Q7 l& y7 U. q, A
$ @6 V# J! @6 V: ^+ j W& e
// Note also, that with the additional
4 u9 T4 ~$ n* j, y+ t; k // `randomizeHeatbugUpdateOrder' Boolean flag we can1 P6 ^8 S& K" I8 _
// randomize the order in which the bugs actually run7 Q& o4 L2 m" f( U/ j) T
// their step rule. This has the effect of removing any+ I0 ~* X- K& Y2 b/ n1 Z; N- N
// systematic bias in the iteration throught the heatbug
% t( w$ g, H `. R: e# s // list from timestep to timestep3 g4 A: B) n/ G& c; q( r6 S. u
5 N' t# W t7 S7 g7 `* @
// By default, all `createActionForEach' modelActions have% ]3 t9 O0 u7 @. E- M5 x
// a default order of `Sequential', which means that the4 l& _+ k6 N4 M" ^5 R# Y% e
// order of iteration through the `heatbugList' will be
6 u# W% P2 ?, v j // identical (assuming the list order is not changed$ e, G* L# r! @: e
// indirectly by some other process).* X4 T0 m1 H! ~# s
6 p, N( ~9 ?3 Q; H0 W modelActions = new ActionGroupImpl (getZone ());
7 h5 G( {$ F4 X0 L* `+ `9 R
; @: f1 P g. _7 U. j7 \& Y% C3 d try {
% |8 B5 }" Q3 H# W2 f' ` modelActions.createActionTo$message
& h, T+ `7 p3 J7 M6 |, a! @ (heat, new Selector (heat.getClass (), "stepRule", false));! [ n- n: Y, H! f9 R. R
} catch (Exception e) {6 b* e# l, a8 P" Y
System.err.println ("Exception stepRule: " + e.getMessage ());
5 Y' s$ F8 p# a2 @! k3 q" i e# T( } }
! D5 N/ Q% ~& h7 W7 C7 ]; U D, E$ B3 T0 m0 h, L# q
try {7 G; m& k* ]2 c# E) l6 Y
Heatbug proto = (Heatbug) heatbugList.get (0);
6 M j+ c. f& P1 b! a2 s; y9 ]6 R Selector sel = y+ \: z8 y' z: ?! ]
new Selector (proto.getClass (), "heatbugStep", false);* ~" ~- P5 T2 k7 C, i5 p
actionForEach =+ N. X+ v! m3 m3 w; a: j3 G! f; g
modelActions.createFActionForEachHomogeneous$call
m# B- k/ L( y& I; B3 {' I; r (heatbugList,) P+ s0 L% f( `1 P
new FCallImpl (this, proto, sel,
8 _3 ~. d% D q! J7 b new FArgumentsImpl (this, sel)));
: j- C+ X' ^5 h } catch (Exception e) {
# M k: }( ?( ^4 V0 R2 E e.printStackTrace (System.err);
" G( J: y6 e9 ?" S4 u }
* t3 |% V8 H5 Z. Z! \% {9 Y
! ~) i' G0 M" v; G0 O1 S6 }+ m/ c syncUpdateOrder ();
9 W- f; z2 `1 {* T! Z7 X* |; s) _9 u3 }5 H: B
try { w' V9 y1 r; o' g- q" z6 Z$ {! c) \
modelActions.createActionTo$message " z @# J# S) F9 x
(heat, new Selector (heat.getClass (), "updateLattice", false));, Q6 o3 |, }+ Z5 t8 Q1 ] Y
} catch (Exception e) {* l& y; a0 z; L& n' ]% w
System.err.println("Exception updateLattice: " + e.getMessage ());+ o. ]( G$ y! B3 L" m
}
( M& ]5 \' j! F! {6 R3 ]& B9 W, V 5 p1 E5 \3 g, o0 \" U& A0 v
// Then we create a schedule that executes the
" I& s% b' [6 O% g1 P0 Q$ i // modelActions. modelActions is an ActionGroup, by itself it
0 u) F" J1 l0 Z // has no notion of time. In order to have it executed in
' Q9 }: H1 t- [8 U. v // time, we create a Schedule that says to use the
7 s* N2 E+ D( D" v; ~ // modelActions ActionGroup at particular times. This t e& q: W7 s8 D; c+ j" J1 j
// schedule has a repeat interval of 1, it will loop every& ~1 _# [1 O2 L6 O6 D" u
// time step. The action is executed at time 0 relative to
4 D c F' J1 \! L2 ?. P // the beginning of the loop.- _- D0 M1 n5 j$ a
% @. q! G3 Y, e3 ~! ]$ B // This is a simple schedule, with only one action that is
2 m* z8 @# U( d" W- d+ n% J // just repeated every time. See jmousetrap for more% s! J- ^4 V! E4 g$ V5 ^2 V
// complicated schedules.
6 F% T' E! o; G4 s* u, j% b
3 F& z2 n' C7 \: V5 Y modelSchedule = new ScheduleImpl (getZone (), 1);% X, D, q2 T/ A* _
modelSchedule.at$createAction (0, modelActions);- [5 g$ L3 |" J5 {' K
, Q+ H1 ~* ]8 U( D# U return this;
6 J5 N0 e* j5 ? B" g9 I } |