HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
$ t1 S9 N) b( Y1 ]$ _. `, h0 R. y" }6 D' U5 M
public Object buildActions () {
' H9 F: } b7 k% d& z/ L8 w super.buildActions();* F; y) N7 Y1 z
) ^* s9 d, \7 k! r
// Create the list of simulation actions. We put these in
) @) h5 r' u6 P0 m/ ]8 _$ x( M; h // an action group, because we want these actions to be
& C i5 M5 B% ?5 d: b* ^- f" n // executed in a specific order, but these steps should
* W& S+ O4 `9 G4 D // take no (simulated) time. The M(foo) means "The message$ u+ I7 j9 C' I+ T# k( s) T# X" s: A
// called <foo>". You can send a message To a particular
# N0 s& F3 V6 |& R/ w$ Z2 w, p // object, or ForEach object in a collection.
: l5 B% `2 n6 E/ G) |4 D) [
; m" L6 Z" k) q, N6 l$ {8 m( y // Note we update the heatspace in two phases: first run9 ]( d' G; Y9 i7 @/ U
// diffusion, then run "updateWorld" to actually enact the8 l% T# X" d! |0 f
// changes the heatbugs have made. The ordering here is
: ~( K7 d, p8 ^ // significant!
u, ~$ L; X6 \7 a 9 b5 T- y$ l3 Z" A3 t
// Note also, that with the additional' i/ B0 E8 F: e: W2 Y
// `randomizeHeatbugUpdateOrder' Boolean flag we can
% ]' J! ]+ i2 N+ C: N& } // randomize the order in which the bugs actually run) s- u; l0 B$ c q
// their step rule. This has the effect of removing any0 W. @8 K7 I# Y: J0 y3 r; O6 d
// systematic bias in the iteration throught the heatbug
; J3 T. X! `* I8 x3 n // list from timestep to timestep: D2 n: V. v! C4 {5 u
2 i; c$ h& r' y s8 r% [0 E
// By default, all `createActionForEach' modelActions have% \, i+ ^2 Z* z' N" E; J/ s
// a default order of `Sequential', which means that the) p7 p1 }/ {4 Z2 }/ h8 {
// order of iteration through the `heatbugList' will be
. p/ e6 y" b [- C- z& V/ K) K. \ // identical (assuming the list order is not changed
( D8 X- w* N3 i: l9 `, _; G" ^ // indirectly by some other process).# D! v. L* D3 s
' j/ p$ t! q8 l, Z$ U# A1 V) g
modelActions = new ActionGroupImpl (getZone ());+ M p! J# G% r1 W( G
6 V: ]7 M; i# w3 h# C try {
8 q1 N! Y: d, R$ E! s& |6 ] modelActions.createActionTo$message
! [4 ^9 H- u& K( E2 \ (heat, new Selector (heat.getClass (), "stepRule", false));/ h4 p8 ~" M7 f
} catch (Exception e) {5 u! V* B0 v( D+ C4 f
System.err.println ("Exception stepRule: " + e.getMessage ());
$ T- m! j$ K$ G# S1 t8 Y! m }8 @! u/ t0 n6 f" Z/ I
$ X! `1 T' B% k# U# X try {
& z. ~0 _ }! F7 g Heatbug proto = (Heatbug) heatbugList.get (0);
. `% I g4 \! D. ^4 a5 y' o, G; X5 P Selector sel = % q0 ]% B. A. m ^4 u: w0 S
new Selector (proto.getClass (), "heatbugStep", false);
' P# V; M q- L u0 J5 Z @ actionForEach =
& \- h) v- y k! f" b5 J; S5 Q modelActions.createFActionForEachHomogeneous$call
$ h3 f3 _. u( U. N (heatbugList,6 E y2 E! y9 }
new FCallImpl (this, proto, sel,
3 s; d5 G& g( X( {* d- O, ^ new FArgumentsImpl (this, sel)));+ }0 K' ?" x% |
} catch (Exception e) {
( ?+ f' z* J5 F) R% V e.printStackTrace (System.err);
* w3 |' v8 g F- J2 V$ a9 s$ D }
' F: U: B; M3 Q6 q6 E$ B: y 7 M# h: _/ c7 q6 L* w$ w+ ?. a6 \ j
syncUpdateOrder ();6 Q! D* n# N7 `6 @5 v5 \& P$ C
% [( t7 S: U T k, `/ P
try {! b# U+ W0 N ?+ _
modelActions.createActionTo$message 1 E0 `6 Y4 |7 ~% b' A" \& d) V7 m
(heat, new Selector (heat.getClass (), "updateLattice", false));
' J4 @& a" I0 Q Q3 S7 ^: d } catch (Exception e) {
8 g7 l, r7 B. p) O System.err.println("Exception updateLattice: " + e.getMessage ());# j% m+ J, k k4 t+ N4 g" c
}3 W) ?2 e K8 S/ o: m8 ^
' c/ w9 I" O4 g: D3 P) W9 |
// Then we create a schedule that executes the
6 c- `$ I4 Z8 @; D0 b // modelActions. modelActions is an ActionGroup, by itself it
8 E" H4 W8 R8 K' N/ q // has no notion of time. In order to have it executed in
" I, F* @' l! |; D // time, we create a Schedule that says to use the! m$ I8 }* R$ @8 r D6 A7 Y4 o
// modelActions ActionGroup at particular times. This8 V$ a3 U6 f7 y. U! m
// schedule has a repeat interval of 1, it will loop every; A$ ~1 G" D# L7 |: C
// time step. The action is executed at time 0 relative to
* e5 g+ k& Z$ H" T // the beginning of the loop.
$ I3 G- X; h6 [) D- I
$ A' x, X. |& S# u+ ^ // This is a simple schedule, with only one action that is
; ]6 k3 \) T1 S6 ^2 {: P // just repeated every time. See jmousetrap for more% C+ d+ g8 k, C7 U
// complicated schedules.- T& t- }% ]5 }& h. G8 P
( R2 n" p4 Q% L( K# k4 e& q; g, z
modelSchedule = new ScheduleImpl (getZone (), 1);
" r2 p8 Z& \ I% R9 P2 c# O modelSchedule.at$createAction (0, modelActions);
1 D$ x3 r$ I3 x4 r+ v* t. _0 H; c w ( s- } s. F% P3 f" e
return this;
2 o0 j0 Z! }% F) p4 @6 D) y, y } |