HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:8 ?4 c! j' G: H. l8 c' m* y- _2 S
4 ?* c! T- P2 D+ S& _- U# g
public Object buildActions () { D F. [% f* W: G
super.buildActions();
' L( l- D' R, i0 _" v; z
7 z/ L! Z0 i' J // Create the list of simulation actions. We put these in& z3 w! Z$ B) H! N2 c7 \4 g& E; k
// an action group, because we want these actions to be
5 T: H' O; L' {) `- ^* ~- D8 g% P // executed in a specific order, but these steps should, W8 u: P% a/ q6 W
// take no (simulated) time. The M(foo) means "The message
9 M2 _, X/ V5 r5 p) h. S" f // called <foo>". You can send a message To a particular
+ A( A4 r$ O8 z# k // object, or ForEach object in a collection.
$ j8 E: n: L5 h : N- U9 C8 [. t5 m( D$ R* |
// Note we update the heatspace in two phases: first run# r; n& N: ]# M; O g3 l6 v1 v" O" [% z
// diffusion, then run "updateWorld" to actually enact the8 q( w& @% m& Z( m# c
// changes the heatbugs have made. The ordering here is- D* L* A6 i% P: [9 Y" `
// significant!% n. I0 h$ v' M/ |6 n. Q
7 l z& e" U) H( k
// Note also, that with the additional+ T- o" k9 O7 t! y& a* u
// `randomizeHeatbugUpdateOrder' Boolean flag we can
0 p0 T5 V9 k1 b4 _, ~ // randomize the order in which the bugs actually run
. ^ Y5 ~* z: c* ~2 e6 Z( F V; k // their step rule. This has the effect of removing any! f; p5 W8 D- a8 l. S- o# {: J" @
// systematic bias in the iteration throught the heatbug
6 `( G9 a: p5 A // list from timestep to timestep& f( b3 R+ I5 }' W& c( V
$ Y5 d- r' [: U2 A1 }+ j7 P // By default, all `createActionForEach' modelActions have
: B, \& w4 n6 \3 j; L" q7 ^; v' t // a default order of `Sequential', which means that the
2 k' H2 ~7 g( h' L* A // order of iteration through the `heatbugList' will be
, g9 p8 }$ C$ U3 t5 y/ F/ u+ a // identical (assuming the list order is not changed; D8 _) l$ A1 C ^: X$ |/ Y
// indirectly by some other process).0 x/ J t k' j( S1 i; ]7 w5 I/ l
j' p& x- O' Y @9 a) v+ ?( L% l
modelActions = new ActionGroupImpl (getZone ());2 S. r$ i/ u+ }5 }
/ m% X* P1 S r3 v" B( {4 Y0 d) l3 q
try {: Q% P) {/ P1 u6 c: u0 c( A
modelActions.createActionTo$message
; n4 i, R- q, E& j. [; ?6 K L ` (heat, new Selector (heat.getClass (), "stepRule", false));
. }/ `5 a. C; t7 Q; T/ B } catch (Exception e) {
% j) a8 V3 W' w( k# T System.err.println ("Exception stepRule: " + e.getMessage ());9 }! O3 w% L6 g* @6 K L" Q' h
}
% I" a! W# R0 G
) C# i0 y( @7 V3 n Y& a try {" I( M' V) q* d( \
Heatbug proto = (Heatbug) heatbugList.get (0);
8 ~! P3 e$ ]% @+ H. B$ o Selector sel = ' t3 r" F1 [" U: A% K* a( r
new Selector (proto.getClass (), "heatbugStep", false);/ T* k) c! y, P9 @) B
actionForEach =
. X% ~5 O: r/ R" Y. O5 W* i modelActions.createFActionForEachHomogeneous$call
& \6 Q/ K4 T! d (heatbugList,
+ Q6 G$ ^2 \% A0 X3 i5 B2 {# p. c new FCallImpl (this, proto, sel,
5 Y5 j4 _5 x& ?2 U" G [ new FArgumentsImpl (this, sel)));
8 [- ^! R" Z, N- b } catch (Exception e) {/ L1 e" |, c. p" y" l: x4 o: K% @
e.printStackTrace (System.err);
7 A) {! c% T1 x" y1 u* T3 D5 D }) q: R% p* I8 e" O, D$ A
! n4 }. E8 s# J( h( S: N6 W syncUpdateOrder ();
* `7 K X" R7 I0 q4 V4 v" w+ l5 Z9 V: E/ `! t1 H# o2 ~& I
try {
! S' m1 r- P. u) G. _4 n+ q/ r modelActions.createActionTo$message * G' A2 B( D4 |
(heat, new Selector (heat.getClass (), "updateLattice", false));
9 D3 t7 ~$ n+ B) ?- @ } catch (Exception e) {
a& K+ p& e$ A) A4 p8 c" ~ System.err.println("Exception updateLattice: " + e.getMessage ());
5 a8 n% w" ?5 J3 n } E8 r5 M! ~" S0 b# f& _3 P3 f0 W
! |0 l* F8 N+ e. x# t( \* f // Then we create a schedule that executes the* x& [5 G7 U ~$ h. X3 B
// modelActions. modelActions is an ActionGroup, by itself it
/ C( u7 x/ _ i // has no notion of time. In order to have it executed in* @: S! ~* t8 b7 C4 I' M
// time, we create a Schedule that says to use the
4 c4 |6 g% k+ I( H% e0 B // modelActions ActionGroup at particular times. This+ g6 d1 S( f, K" y" ^5 h) ^4 H& e
// schedule has a repeat interval of 1, it will loop every
6 Q! {8 @% X1 P# K. ?: S& e/ m // time step. The action is executed at time 0 relative to [" r' k2 [: `- h3 I6 K# o
// the beginning of the loop.! l- V0 f& E1 U
: a/ Z& g+ S; e1 j2 w // This is a simple schedule, with only one action that is
! N" }: x! k5 Z* d& k0 L2 O- a // just repeated every time. See jmousetrap for more
- M* a) a1 l- ~ // complicated schedules.
$ F6 q6 w4 e1 c0 J; M4 J ' a4 ^& q2 H3 Q! b) K7 |' O, I0 b" ^0 }
modelSchedule = new ScheduleImpl (getZone (), 1);
6 h; q* s; ^9 e8 x0 K. m t6 n8 U modelSchedule.at$createAction (0, modelActions);
* x$ ]& t7 Z; T9 E# a+ T
5 Y/ h! D2 W0 T3 W3 T4 V5 D) Q$ n return this;2 {; [, ?- \ }, q
} |