HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:6 W: E9 j( J1 p; r
2 H" H7 u F$ I* h. U$ b1 [ public Object buildActions () {
& b& t$ U0 s: J" o# w ?7 V super.buildActions();
2 G' G. o1 k8 | 7 t3 ]( ^# b$ [; b, ?0 u; m A4 E
// Create the list of simulation actions. We put these in7 s. }2 _, z, b$ L; I% k7 q) k& Z0 o! S1 |
// an action group, because we want these actions to be: G& N# }" N* m/ o
// executed in a specific order, but these steps should$ g" A5 ~7 R0 A
// take no (simulated) time. The M(foo) means "The message- V2 n4 ~2 z# h( D! r* U
// called <foo>". You can send a message To a particular
4 B0 m; g& ~1 a* f // object, or ForEach object in a collection.
9 T3 [5 Z, X* ^$ S- ` % k1 Z0 t! f3 d+ d
// Note we update the heatspace in two phases: first run
+ ?# v3 L4 M5 e( ~1 `% T // diffusion, then run "updateWorld" to actually enact the! t: z0 j% b" L% A; l/ a, O9 m
// changes the heatbugs have made. The ordering here is
' Z# q$ W$ O8 D9 z9 j) y- i2 v // significant!
! {3 q- ^. J- _) q+ a
! f: G' F1 Z% v# B; i, l1 d // Note also, that with the additional
& ]$ _0 b8 k) R: n8 p5 P1 j% Z3 B // `randomizeHeatbugUpdateOrder' Boolean flag we can
7 A9 b: z6 m0 d0 \& l // randomize the order in which the bugs actually run# M! ~ { o0 ~; P
// their step rule. This has the effect of removing any! @2 }. B3 P% s8 [& r3 C1 g( V- I
// systematic bias in the iteration throught the heatbug" B( Y) c# B% n: v5 P
// list from timestep to timestep
: D+ @/ D; p- l6 @, M & ~( y, s( u- `0 n
// By default, all `createActionForEach' modelActions have/ ]/ i2 K `/ i- i8 T: x2 g
// a default order of `Sequential', which means that the6 ~& U. x0 a% l1 H8 ?
// order of iteration through the `heatbugList' will be
5 C2 |( s1 ^ r& V9 z, w // identical (assuming the list order is not changed
0 v) \6 E8 \+ l // indirectly by some other process).5 p) l8 `, s1 }8 a9 H
; L/ g! g, K# w' Y, b+ p5 o modelActions = new ActionGroupImpl (getZone ());
" k; ]- V% @+ {) X
' | \1 H8 J6 j6 N Z" Y$ ? try {) u: q7 b7 |! X9 w# ?% p% N
modelActions.createActionTo$message
- W1 ]; a7 i9 v3 ]) c+ T+ o (heat, new Selector (heat.getClass (), "stepRule", false));
7 i9 w: }9 b7 N1 O } catch (Exception e) {/ J0 y$ m% { M
System.err.println ("Exception stepRule: " + e.getMessage ());
/ ~" M/ f: w) v$ A9 w6 { }# H0 g5 F4 X- J; U8 v8 N
" a: D P. R$ Z3 I" { try {0 G* K. c$ [# N3 r8 D
Heatbug proto = (Heatbug) heatbugList.get (0);
E$ U/ N" e, W9 F# _, y Selector sel =
' n# I& B# _. N: _ Z- m. | new Selector (proto.getClass (), "heatbugStep", false);
; g4 {7 Z$ `& _9 z+ p$ h actionForEach =
7 L1 |& B3 h+ f5 S modelActions.createFActionForEachHomogeneous$call
4 @6 D) m0 q/ |$ j- S! p (heatbugList,
1 P9 C3 T) v7 w, K new FCallImpl (this, proto, sel,
' e$ L& N1 A0 {0 G& [) E new FArgumentsImpl (this, sel)));
7 S% i% R6 N( D$ r) J. j! z } catch (Exception e) {
% O) k* E' b! ^ e.printStackTrace (System.err);
& n9 _& }$ q, [& w- E. ^! g+ N }
( X' S6 c% z1 M A, ^ 4 L$ Q2 L% j4 j! B+ {1 ^
syncUpdateOrder ();( i( ]+ i' ^6 h" O
3 ~! `; Y& K( [. d0 z1 B, o try {
$ S* s3 c0 \4 O+ J1 U9 C5 O" P modelActions.createActionTo$message
% Y! {7 X# o$ @, ]7 l+ y3 z (heat, new Selector (heat.getClass (), "updateLattice", false));$ Y" K, v/ J9 \* j# F* }
} catch (Exception e) {
, o2 s- J) k7 ^& T System.err.println("Exception updateLattice: " + e.getMessage ());
/ ^) P- |. s0 }3 @5 [ } R7 O8 Q# V7 K% c& A
3 m' j3 u, J8 U- l+ e8 v+ m. X& c // Then we create a schedule that executes the
' j( Z: P8 j$ i0 ]$ r. Q // modelActions. modelActions is an ActionGroup, by itself it6 Y/ x+ |) X5 F' S
// has no notion of time. In order to have it executed in
2 F$ u: u& z) e, D4 R8 T/ D6 v/ m // time, we create a Schedule that says to use the
- K3 f; f% d+ t6 U) x8 @$ T) ?& f // modelActions ActionGroup at particular times. This
d3 U' b: g/ N5 d$ a // schedule has a repeat interval of 1, it will loop every$ D+ j3 A! ^/ f! h
// time step. The action is executed at time 0 relative to( ~0 a5 U+ P4 B. q
// the beginning of the loop.8 z& H' U% w9 W. E! Q
; d0 L) Y: D/ q5 c" i // This is a simple schedule, with only one action that is
; m) d/ W: t4 [% `. s% Z8 V4 D6 | // just repeated every time. See jmousetrap for more
, N: P0 @, P& o // complicated schedules.' T! W9 L+ Y0 j* c& o* M! o
& D& n! E* a" C* x. h modelSchedule = new ScheduleImpl (getZone (), 1);
. B; Y* M+ ` F6 p' @- s8 o modelSchedule.at$createAction (0, modelActions);/ P. U. V5 y+ [( ]
9 }! G( b- {9 I+ T5 ^0 w return this;
2 ^$ p3 J5 E6 l. \+ ] } |