HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
1 Y: v g. _! Z+ k5 Y' `* V: Z; g- @0 ~, B
public Object buildActions () {0 L$ ]: l/ t1 s+ X o
super.buildActions();
7 g+ A# F. H5 N$ Z. G; U1 t. d
5 h) b9 {* I& t# ?- w* O2 z // Create the list of simulation actions. We put these in$ g6 `% G" `5 G! x
// an action group, because we want these actions to be6 @, T" r* [/ [: i% z: P
// executed in a specific order, but these steps should
" \% U7 d L) S. y$ ~4 { a' l4 D; Z' f // take no (simulated) time. The M(foo) means "The message
+ y$ \% I' B9 _6 G$ ]4 p% f // called <foo>". You can send a message To a particular
1 Q, H/ p" k( W1 h // object, or ForEach object in a collection.3 B/ ^! g6 l* n0 n
' H. Y$ o4 o8 X: k* m6 [% r // Note we update the heatspace in two phases: first run! f! P- W9 N2 v5 N% W) J* g
// diffusion, then run "updateWorld" to actually enact the- W) G- h! m4 g( f
// changes the heatbugs have made. The ordering here is4 d0 w7 l- m' a+ w; Z/ P
// significant!# ^7 |; O4 f2 |9 u
/ O3 s4 ~4 O: ?- b+ F
// Note also, that with the additional
0 N- \1 f2 R- J" \' E8 [ // `randomizeHeatbugUpdateOrder' Boolean flag we can
& p4 M* o* G: j. `: r( Z // randomize the order in which the bugs actually run ^7 |' d% {( h. i, o
// their step rule. This has the effect of removing any; {; n3 G9 e. D% i
// systematic bias in the iteration throught the heatbug
, Y! o" m7 E/ |1 V% F. i& T8 b% c# T+ M // list from timestep to timestep
& l; C3 U( t8 Q' g8 ` # X2 W3 b7 o/ `) f! d5 |/ S
// By default, all `createActionForEach' modelActions have/ N- v" t6 K# R. ~ y! a
// a default order of `Sequential', which means that the
; s/ R) W9 f3 K& m // order of iteration through the `heatbugList' will be7 w) q9 a! F& G6 j7 y
// identical (assuming the list order is not changed. n* u; R3 p) S8 z1 Z
// indirectly by some other process).' E" h5 l: h" R5 z3 |2 |
: B$ A+ N/ r; F1 s( l
modelActions = new ActionGroupImpl (getZone ());
* z+ o& t5 b, {# G; z
; s9 \. Y1 C: p- Y try {; D" @3 |% Q1 {: j* ~
modelActions.createActionTo$message! E* k, F( i' ]
(heat, new Selector (heat.getClass (), "stepRule", false));& S( Q1 s# m" l) ?& s5 ^$ y
} catch (Exception e) {' ^. l+ h6 S7 e1 M
System.err.println ("Exception stepRule: " + e.getMessage ());
( G+ j9 K) }/ k; E* d }
7 V8 e( J" R/ r2 e$ V! z: ?$ ^6 w( ^2 y
try {" m1 S' X$ v! {$ g
Heatbug proto = (Heatbug) heatbugList.get (0);
# p6 R( [0 J% O3 [8 I }3 r Selector sel =
) D& V/ R' b( F, S new Selector (proto.getClass (), "heatbugStep", false);) @1 s% r' n' O1 p6 E/ x/ @
actionForEach =& _! R* {& y$ T3 _/ ~9 _$ e0 E
modelActions.createFActionForEachHomogeneous$call
: s5 r4 }* v6 A0 ~8 _/ }) l (heatbugList," Q. G4 k( V; x/ ]
new FCallImpl (this, proto, sel,* X' K9 t5 a3 B& B1 k
new FArgumentsImpl (this, sel)));$ e- g8 B# @' `
} catch (Exception e) {7 _$ B& Y( R; X+ t# G9 I- F) s
e.printStackTrace (System.err);
0 V6 A: f. K* @) D5 ]' B9 b6 \ }3 S+ x" r0 v: R& p. a
: E+ z, m0 M+ @" m1 F syncUpdateOrder ();7 Y% q/ B$ J: i, A; ?' K
+ s! {( Z! l; w. ` X( ~" f
try {4 @. [# X2 a! s& G
modelActions.createActionTo$message 6 o* [7 i. u, g7 H' ]7 r
(heat, new Selector (heat.getClass (), "updateLattice", false));0 t1 q9 F' r: l& Z4 l# K
} catch (Exception e) {
+ @7 e. f/ c# l: S System.err.println("Exception updateLattice: " + e.getMessage ());% A8 q: U5 x, h, n# y+ r7 M
}7 [3 C0 J7 x4 j1 d+ k3 e
! E0 Q1 w# o9 J8 ]& T( `4 T" V // Then we create a schedule that executes the- e! ~3 i" j* v3 _( N+ _
// modelActions. modelActions is an ActionGroup, by itself it# x) m# c! }7 J8 c/ o S) w
// has no notion of time. In order to have it executed in+ H9 x: H+ o. v: \
// time, we create a Schedule that says to use the
4 H( S( t( S" }3 a, j- f' | // modelActions ActionGroup at particular times. This# G7 a* T/ R, \ l9 q8 @+ G
// schedule has a repeat interval of 1, it will loop every! S3 A" u) v1 q* E7 F
// time step. The action is executed at time 0 relative to: W8 X- B& Z* l: O3 }9 f
// the beginning of the loop.0 q9 s. }1 l$ ]9 K: n* {: y% k
$ k0 W6 ?! P& ]5 @7 ~2 c+ L // This is a simple schedule, with only one action that is* c8 |( u8 s( j0 `! [5 b( F+ |
// just repeated every time. See jmousetrap for more
% W' ~) g2 h# d* d& C! `# s // complicated schedules./ d5 t' s+ ~4 O8 ^
8 s9 t4 ]5 }% m% A
modelSchedule = new ScheduleImpl (getZone (), 1);
7 R' s9 }4 t1 b; s! Z- H modelSchedule.at$createAction (0, modelActions);6 ?' q& K2 b7 z* n! M6 m' M
& e" k7 U7 [/ m
return this;1 M2 _8 `9 T- d
} |