HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
- x1 m t4 Z9 x' H8 k: p
. k: g( Q, }5 A* |$ ~ public Object buildActions () {
7 `- A b' E# c3 |0 N2 O+ \6 o5 z super.buildActions();
6 ]( u9 `4 D) z; m3 X' O " A- j% s$ t5 H4 k
// Create the list of simulation actions. We put these in" T% }! K" K. K
// an action group, because we want these actions to be
2 ?* N+ I, K! A1 \; w // executed in a specific order, but these steps should* _/ o M8 U* \" K
// take no (simulated) time. The M(foo) means "The message
1 s. E9 A; |4 y: ^8 h // called <foo>". You can send a message To a particular' M& A& @; [6 E7 H8 B
// object, or ForEach object in a collection.8 S( U! R9 ?! s, d$ }8 \" C: D. a
2 m( O- c( l5 @2 J! ~. w8 M# Y
// Note we update the heatspace in two phases: first run8 a& Y8 } _7 {7 S
// diffusion, then run "updateWorld" to actually enact the
! c0 J$ B* u+ l" b3 W4 u // changes the heatbugs have made. The ordering here is+ r" R/ {% ?. u5 a1 z J4 @
// significant!
$ C X7 O0 K( k: Y1 y
. V1 A& A- }; n. y4 B // Note also, that with the additional
5 [7 N" H- m- B( m: b v // `randomizeHeatbugUpdateOrder' Boolean flag we can
* Y# d' X& e. d1 `/ F S* o // randomize the order in which the bugs actually run
1 U Z! V$ ^* m5 w) ] // their step rule. This has the effect of removing any m( c5 C# e& q* m# v- @& o) ~- Q
// systematic bias in the iteration throught the heatbug2 |* d- e; k+ c6 ]6 X6 W+ X, u5 m
// list from timestep to timestep
# ^& D9 ~3 @) u m$ e. Y4 O : B! \2 u8 i" u8 W3 q/ ~( ^
// By default, all `createActionForEach' modelActions have
$ S; M" i# c. q6 g$ F // a default order of `Sequential', which means that the
( h" h9 r) i2 M6 r1 s' g9 ` // order of iteration through the `heatbugList' will be
8 ?+ N! w @* ^4 I // identical (assuming the list order is not changed
3 b3 R/ n; f1 q/ m! \2 w5 p // indirectly by some other process).
4 i8 `( u1 s3 D
0 Q. v/ h v$ c7 }, t/ f modelActions = new ActionGroupImpl (getZone ());- n7 k1 P2 x( S$ \
, `) `+ e% G D
try {7 c; u3 R; A `' G N8 [' i% Y
modelActions.createActionTo$message* q ^& t x* R# o0 L
(heat, new Selector (heat.getClass (), "stepRule", false));- I! w* }' R5 M' W
} catch (Exception e) {
8 M: Z0 r* g" z6 q+ m System.err.println ("Exception stepRule: " + e.getMessage ());* Z8 n0 @# e- p8 D- v, v- k
}
5 q) a, c! T" f. w7 v
+ l7 n9 f \3 T7 B' u: R try {
5 _2 q5 q1 B: \6 Z1 |- s Heatbug proto = (Heatbug) heatbugList.get (0);
; W' A6 w/ U, P* F5 A$ `7 y Selector sel =
6 c F! s8 L; n3 e) b' ]# |4 e8 e new Selector (proto.getClass (), "heatbugStep", false);( K Y$ ~! u% ^+ ~
actionForEach =$ [# X7 z# ^: [2 v
modelActions.createFActionForEachHomogeneous$call5 s% y; P" q( p6 p; D* v
(heatbugList," ^* ]3 M* Y- N: B* ^+ Z) x
new FCallImpl (this, proto, sel, p9 t+ t# u, z! t% [; f8 w
new FArgumentsImpl (this, sel)));
3 M8 F. X; E8 Q# N1 O' J } catch (Exception e) {
" s8 {% W6 X, v5 r& J# q e.printStackTrace (System.err);
( b. [8 Z& b$ z2 D# { }
& N0 H) v" |* ^# h+ W: o1 k
8 c# X0 ^$ J9 J8 Z; m syncUpdateOrder ();
4 F* j3 F! U f4 {
1 R2 ~' i* J% ~9 K" ~" c try {
6 Y' G! R9 z. c& P# ]% i& F0 T modelActions.createActionTo$message & Y" B/ h7 |2 T. \/ a- I
(heat, new Selector (heat.getClass (), "updateLattice", false));
; ~# t3 }' v* Z( _8 } } catch (Exception e) {
/ E6 ^0 G1 z e% [$ O) e/ W' v2 T; G System.err.println("Exception updateLattice: " + e.getMessage ());7 i- p! K4 ~5 r8 u8 P7 I: o4 U
}
. \8 f) W6 d' ^+ _ h+ s, v
/ H P# [& D* y& T( i* E // Then we create a schedule that executes the+ ?8 N! G# n3 I1 t
// modelActions. modelActions is an ActionGroup, by itself it1 e( b5 ^; S J& V! h9 H8 w
// has no notion of time. In order to have it executed in; K" X/ P9 o$ z0 H2 b
// time, we create a Schedule that says to use the
: U7 M# w/ f$ T. N // modelActions ActionGroup at particular times. This
( t0 @5 W( h- I( t* S$ Q // schedule has a repeat interval of 1, it will loop every
6 q" P/ h$ D- ~6 K- u // time step. The action is executed at time 0 relative to( m8 u0 g) w. n U0 Z* t, b) n
// the beginning of the loop.3 z! B1 J6 T8 ]' I; a* U
W' ^4 S* e5 Q2 Z // This is a simple schedule, with only one action that is' {2 k- z0 H/ A f
// just repeated every time. See jmousetrap for more- _, u" y; s! S2 L- ^, D
// complicated schedules.
1 H$ {$ G$ m t) T3 \7 v& m : C5 ^0 b' w2 `8 z
modelSchedule = new ScheduleImpl (getZone (), 1);
! O* A' `! `- Z) r) m" ?. r modelSchedule.at$createAction (0, modelActions);2 `: n6 G- }) z5 q4 m
5 Y% O# `' a9 X7 h1 N3 s return this;
* l5 @* V" M+ u3 S! Z } |