HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
; A: m! j4 c$ `1 h! {* F: |& O/ \/ q, N7 w" r
public Object buildActions () {$ O* {8 c* t& P! w, U: @
super.buildActions();3 W+ e% [5 H; V4 E1 }: }
& Z u. U& r4 b) l) U' K; W1 ]
// Create the list of simulation actions. We put these in% r6 h6 @( j( L9 G
// an action group, because we want these actions to be1 k& i& S- G: g N
// executed in a specific order, but these steps should- ^( z( I' ?% l
// take no (simulated) time. The M(foo) means "The message
$ n3 Z+ O/ z! I% i- v( @/ m // called <foo>". You can send a message To a particular
Q5 [! t6 ?' ?1 F4 Q // object, or ForEach object in a collection.
$ `2 A6 e' c& A& v 0 @6 `3 z9 M r: p( V
// Note we update the heatspace in two phases: first run( s7 T3 a3 x$ \4 p( p2 O9 \/ q9 }
// diffusion, then run "updateWorld" to actually enact the4 k7 [* D1 e' G0 [; o
// changes the heatbugs have made. The ordering here is
" }; O6 w; O2 n' V" B' u* J1 X // significant!, Q: D0 b' G4 x% `/ h( H; b
9 [! F8 |) ~6 [. S# T3 K
// Note also, that with the additional; D5 S7 b* j& ~! j9 D. |' F% n2 t
// `randomizeHeatbugUpdateOrder' Boolean flag we can
, w, O3 N3 Z" \# t+ e; `' ?& ~ // randomize the order in which the bugs actually run
/ z! i. E. S& f' _( t: _ v // their step rule. This has the effect of removing any0 b7 ]. I9 N7 W' m; v
// systematic bias in the iteration throught the heatbug: _( O1 L1 L0 A
// list from timestep to timestep" F4 L2 [0 |, i' |, T4 M/ d
& @6 W- Z4 W; Y // By default, all `createActionForEach' modelActions have
" k- d& P8 a9 }$ @# d# C" H$ ~ // a default order of `Sequential', which means that the
! _ D5 k6 b& e$ O8 s // order of iteration through the `heatbugList' will be0 U4 x7 Z) N$ R3 v7 F- U
// identical (assuming the list order is not changed
" L( @7 U$ C# X& [4 C // indirectly by some other process).! q: [% d: S+ X) Z n$ a3 c6 p* ?
% I3 f1 ?2 q4 C
modelActions = new ActionGroupImpl (getZone ());7 j$ c8 x% i$ t6 }* s5 T3 z( G
* N& k3 f- G* U try {
3 j7 e/ X0 x! y# J Y modelActions.createActionTo$message9 U7 ^% W5 [* u. p; d2 A7 A- f
(heat, new Selector (heat.getClass (), "stepRule", false));9 u4 x8 Y/ T( o6 K
} catch (Exception e) {
' G$ e2 ?$ x) G5 p p5 O6 q" r System.err.println ("Exception stepRule: " + e.getMessage ());. h3 |$ `8 a2 M2 w
}3 C# ?9 r: a1 }2 c+ `
0 D( u! ~ C+ [5 n8 {2 L
try {. s' l2 v2 ^, x- h4 B
Heatbug proto = (Heatbug) heatbugList.get (0);$ ~' a' Z6 c5 F- I- D7 P1 a e
Selector sel = $ `. G9 s$ w/ L9 S
new Selector (proto.getClass (), "heatbugStep", false);9 R" R2 a" X2 O0 N) B4 q: J0 W
actionForEach =' }5 W# |8 s2 P5 O1 l1 o
modelActions.createFActionForEachHomogeneous$call
7 |- u* {& d, J4 O+ L (heatbugList,
6 @( K( m. v; h0 t2 M new FCallImpl (this, proto, sel,- i3 h# T7 \% ~5 k. T/ {% b
new FArgumentsImpl (this, sel)));
2 H4 w {/ Z; z# P3 h8 m } catch (Exception e) {
; l- }! n# k, x% T. t7 y3 T" {4 w e.printStackTrace (System.err);
* c; w7 F' d" ^5 h }; }" r5 }0 k/ R# U
: b3 R" @1 Z2 R* A# W& {& |
syncUpdateOrder ();- `0 S v+ t# L1 b9 G) e) ]* ^) G
2 C! i- }* i3 L4 U! q5 B4 k0 \( j try {
* A2 Q6 R2 ?( s4 g modelActions.createActionTo$message
( x0 K7 M( a% m9 @ (heat, new Selector (heat.getClass (), "updateLattice", false));) r' G7 V3 _0 ^6 ]9 r
} catch (Exception e) {
8 S2 M( J$ C/ z& X System.err.println("Exception updateLattice: " + e.getMessage ());9 i1 m, G* p7 c' k. x9 Q
}# k! ?- j9 x2 R' _- w
) u. ]1 W3 Y* J, I- z# p! N7 I* Q8 u( p // Then we create a schedule that executes the
! ]! ~1 c5 s7 \: K2 P // modelActions. modelActions is an ActionGroup, by itself it$ V* e' U1 p2 A7 P7 W z; r; i! H q
// has no notion of time. In order to have it executed in
% Q" ?' v: t1 N; m // time, we create a Schedule that says to use the# p- q: Z5 c/ `' _0 \5 t7 _
// modelActions ActionGroup at particular times. This' p. w7 k- U- ~
// schedule has a repeat interval of 1, it will loop every* Q: s* O9 J& W! a, W
// time step. The action is executed at time 0 relative to
+ k8 F, G4 L% R // the beginning of the loop.
g+ S. U: a' X; B: H/ o4 T
3 B/ t) m1 v! _7 j% H! m // This is a simple schedule, with only one action that is
3 c0 V6 w/ g; {* P# _" m // just repeated every time. See jmousetrap for more
" a4 U8 z5 A8 h. _! n( U. w, r // complicated schedules., _( |" L% ]7 X s3 s
& U+ S: H7 J- C, x# x modelSchedule = new ScheduleImpl (getZone (), 1);
# m/ v. Z% y% s8 g. F! y modelSchedule.at$createAction (0, modelActions);! h3 z( W% }4 M- v9 f
9 _. ~0 P9 `- g' s. X1 m
return this;9 E5 P( F/ Z% L9 t) C
} |