HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:1 C7 o$ ]$ D! W4 j8 ]# Q% b" K
L" w! O; p3 c public Object buildActions () {5 F% d, {$ B r: ^
super.buildActions();0 y; \9 Q6 Y5 s3 ?0 L' V, @; T) n
0 A$ Q3 z* i; O5 d
// Create the list of simulation actions. We put these in
. u" F! z6 ]$ b4 C5 U" I) x // an action group, because we want these actions to be
2 a: y/ k0 m% L* \1 P4 } // executed in a specific order, but these steps should
0 O( h" O" j8 g8 q+ A" v/ r // take no (simulated) time. The M(foo) means "The message
2 r4 H3 V% y+ J // called <foo>". You can send a message To a particular+ U; l: u( w$ X3 G" {9 h* H
// object, or ForEach object in a collection.
1 g: Z/ N, i6 o, L9 H4 t ) [ p: z) u( L; `9 F
// Note we update the heatspace in two phases: first run
( i. [) C$ m( V2 ] // diffusion, then run "updateWorld" to actually enact the
: A% p. y$ N4 T7 m // changes the heatbugs have made. The ordering here is4 D7 ~! M' z" R7 m+ {$ B
// significant!
8 n5 |3 y9 F4 P$ X+ i2 S
2 t- m' p; |! L2 n. I // Note also, that with the additional- i7 p3 B, t' |) T3 D G1 [! M
// `randomizeHeatbugUpdateOrder' Boolean flag we can' O& a6 x# w$ v4 d/ l4 p! E% \6 l
// randomize the order in which the bugs actually run5 D1 ]5 ?& c( m1 V; ?
// their step rule. This has the effect of removing any) x# P: [/ o* [, {) [
// systematic bias in the iteration throught the heatbug- b! ^ v* R. U9 N$ M
// list from timestep to timestep# { K' I$ E% P
$ A# V$ Y% k$ {
// By default, all `createActionForEach' modelActions have5 G5 N$ B; S6 x2 K( F4 S$ m# t
// a default order of `Sequential', which means that the
P/ E' X, k* d. W1 g/ ^9 s // order of iteration through the `heatbugList' will be
& f1 t# ]2 C |' d0 X' T) | // identical (assuming the list order is not changed
, B' _; p) r% p, P7 I7 m // indirectly by some other process).( H5 l4 J& x6 x! a8 O ~% r- g. ^
% K. b% C2 Z- d# O/ D4 c# K modelActions = new ActionGroupImpl (getZone ());
; K: R1 s- y3 [, ?
0 u8 P2 H1 @0 V% X try {/ T' S" u" @: {; l6 _' k7 `7 S
modelActions.createActionTo$message
- O3 @7 r: o3 L (heat, new Selector (heat.getClass (), "stepRule", false));
$ B$ T% _% ?1 @$ l } catch (Exception e) {5 @( c9 ^$ W. V p0 Q0 }. ^ u
System.err.println ("Exception stepRule: " + e.getMessage ());
# r3 G- D1 o$ L6 a }
- [/ T5 z$ t% i' A) w5 b# F- U" i( D' m/ E
try {
8 Z k# Q' I- ~- [: c$ v" l Heatbug proto = (Heatbug) heatbugList.get (0);3 ^% n$ H& F. k& _! L4 [
Selector sel =
! o# r3 W, k& u" h4 i new Selector (proto.getClass (), "heatbugStep", false);0 e9 g& e [ B i8 u! T
actionForEach =! [0 _ o$ L3 d' l3 M4 M$ V
modelActions.createFActionForEachHomogeneous$call
& C k) X4 o x (heatbugList,6 x' H6 ], q6 q
new FCallImpl (this, proto, sel,4 l4 Z8 {: @8 _
new FArgumentsImpl (this, sel)));, Q t, Q! Z+ k- J8 @
} catch (Exception e) {
4 z9 l5 N+ K9 v0 g2 m( G e.printStackTrace (System.err);
, z8 D( `: i" h' ?4 T }
( \, p, a$ n0 L( U ( _, I( Q7 n6 a* x, g9 n
syncUpdateOrder ();" N# P9 B6 V" z0 }( P6 B% C
' }1 ]& c( h9 I! t* p! j+ N try {
- @; N6 |7 |8 |, a& j modelActions.createActionTo$message 4 m5 p$ H o( {
(heat, new Selector (heat.getClass (), "updateLattice", false));
! t3 Y/ U" j( r0 w } catch (Exception e) {$ o+ \5 W" y4 Y% W, ~
System.err.println("Exception updateLattice: " + e.getMessage ());
8 z, M0 I4 v; K* b" k: U2 e$ R5 {1 g }
# R. d/ d7 O5 f + c' _/ K" I8 `8 M( s3 R0 i
// Then we create a schedule that executes the2 a$ R( \! z. N! `' \- r! P2 X
// modelActions. modelActions is an ActionGroup, by itself it
- ^' p" z# o* e* }5 e1 | // has no notion of time. In order to have it executed in7 F+ B d/ o, }# N+ }
// time, we create a Schedule that says to use the+ K- @1 C$ o/ g+ k
// modelActions ActionGroup at particular times. This
3 A3 |: I* f& Z1 M4 F0 ^ H0 d // schedule has a repeat interval of 1, it will loop every; j r$ Q% t! _5 C/ ^' z
// time step. The action is executed at time 0 relative to/ M% P# j% c! f4 V0 F7 U
// the beginning of the loop.9 Z. R. T. O' u6 f
& f4 ?# L9 g" O x3 H // This is a simple schedule, with only one action that is
3 [2 g+ s* J1 K& A: W7 p // just repeated every time. See jmousetrap for more0 {) M) W* \: Q) H0 q
// complicated schedules.
0 V# k5 g8 ~# _, q y
+ V3 V0 @4 A; u" A |$ r modelSchedule = new ScheduleImpl (getZone (), 1);$ j3 M' W2 J8 k; A* U! t' j
modelSchedule.at$createAction (0, modelActions);
+ m4 l: k' }1 J3 b# ^5 n
. L! T* P0 Z2 @* t+ M1 h3 q& l return this;
: J+ l: t, z2 ^& T; | } |