HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
# `2 M! l4 Z+ Y& ~# Y- X; E( ~+ q$ {% A4 u" F$ Z9 O* L
public Object buildActions () {5 j' o, v+ Q1 H Y1 J, M' U
super.buildActions();" p1 o# p+ X- p7 Y
/ \3 r1 i4 V3 X // Create the list of simulation actions. We put these in
: y# X$ A* `& W' s. T // an action group, because we want these actions to be
7 b. t) b$ k/ Z; H // executed in a specific order, but these steps should
. G9 l, h% L6 _# M- M% | // take no (simulated) time. The M(foo) means "The message( u* \/ y0 B: j& Z0 {, z
// called <foo>". You can send a message To a particular( Z5 D) p5 `9 c3 p
// object, or ForEach object in a collection.0 i& O7 Q, K+ o5 A5 v, E# M
) T6 h& F/ W3 b- y, S
// Note we update the heatspace in two phases: first run
3 T: j' S2 D8 J8 R, G1 V" ? // diffusion, then run "updateWorld" to actually enact the& |2 A C" E+ I$ U; p% N
// changes the heatbugs have made. The ordering here is5 I' u2 _, n0 i9 o2 Y3 `% S% e+ d
// significant!
. X- A) X+ [" X! a& h: C% D
6 Q1 ~3 [6 N3 M2 I$ B // Note also, that with the additional- J5 o, F4 j" q4 E3 o" J4 ]7 m" l
// `randomizeHeatbugUpdateOrder' Boolean flag we can
9 |8 O" L# {; B* M- \# s // randomize the order in which the bugs actually run
% p' M! i& Y* E; u // their step rule. This has the effect of removing any
5 q4 g; {8 g' a8 z // systematic bias in the iteration throught the heatbug q8 R( f, r( w9 [5 P0 d( v
// list from timestep to timestep, l, _8 _0 }0 T; T
, z& |# Z) o4 P/ q) w
// By default, all `createActionForEach' modelActions have
; u6 L: w' L% [ // a default order of `Sequential', which means that the
/ G2 R/ x2 [* V$ t* x' } G // order of iteration through the `heatbugList' will be
8 t) g9 `" p+ T- q // identical (assuming the list order is not changed6 o$ `4 [5 A! y' F
// indirectly by some other process).
# {; G7 ?6 n- {* h7 W, M1 L6 S
0 u5 ^ i% `* P$ k2 N/ K' E- S" O modelActions = new ActionGroupImpl (getZone ());# ]% |7 t4 k* q! a2 y% O
8 R% B5 ?% B) G! e( Y try {
( G$ W) d; |) O modelActions.createActionTo$message
- t n4 x E1 Q3 k: E (heat, new Selector (heat.getClass (), "stepRule", false));& i- A8 j! O# n- Q. f/ T
} catch (Exception e) {
, ^8 m' B% B- N/ C# \ System.err.println ("Exception stepRule: " + e.getMessage ());
9 j- i' r7 b" B" X7 }) o } Q8 f8 o% A5 a( n; h5 I
) I/ r% b' e5 |
try {1 M( |6 G \9 P3 _6 N4 z
Heatbug proto = (Heatbug) heatbugList.get (0);0 R. w& J: U, k. L0 [$ i
Selector sel =
6 B9 z* J( J% |8 a) V new Selector (proto.getClass (), "heatbugStep", false);
6 c9 I8 | j: V# k1 _ actionForEach =
* v( M G+ C3 |+ L$ r modelActions.createFActionForEachHomogeneous$call$ K6 w+ ?2 d- y' P6 O
(heatbugList,# Y$ b1 j6 p+ d6 X. w
new FCallImpl (this, proto, sel,
1 q" ~: K9 ^( d new FArgumentsImpl (this, sel)));
7 L. @, ^, @0 L8 T7 f, \7 X } catch (Exception e) { k- f* W0 ?) u9 i
e.printStackTrace (System.err);: i3 \) z: z/ c4 q
}
# L6 Y0 {% k$ J& a 1 ?9 v2 g: n& l0 t
syncUpdateOrder ();9 c# o1 c3 [' A
: g9 E d3 p8 o( d* O
try {
* E$ j/ U3 ^9 U/ e- m modelActions.createActionTo$message x' Y0 q3 _# \6 L
(heat, new Selector (heat.getClass (), "updateLattice", false));
4 ]* `6 ^3 r. } N: | } catch (Exception e) {6 _; N5 P7 K8 ~% E9 W
System.err.println("Exception updateLattice: " + e.getMessage ());
5 n: M* D y8 P! \ }
+ C4 @" L+ H5 a; Z( G# J! S( }* v
) t1 D) G0 N; q5 Y // Then we create a schedule that executes the
; k' i' M) s7 ]8 p" h8 D // modelActions. modelActions is an ActionGroup, by itself it( m+ @4 X0 f3 d0 X, A$ A2 A) p
// has no notion of time. In order to have it executed in
1 L' |! J5 Q- h // time, we create a Schedule that says to use the( `/ u9 O3 m9 Q9 d5 Q5 U6 u' q0 W
// modelActions ActionGroup at particular times. This7 O W) [8 d. W
// schedule has a repeat interval of 1, it will loop every/ n4 m& W' B: `
// time step. The action is executed at time 0 relative to
0 Y7 ]4 I/ V% _" U: t // the beginning of the loop.
! S6 m) O4 b. E0 k& ~; A- F/ _5 |$ `$ i8 f5 `
// This is a simple schedule, with only one action that is
& X0 O$ Y7 ~( f* e6 w" n6 t // just repeated every time. See jmousetrap for more* S, i( G' L: _' _0 S
// complicated schedules.
0 M6 J& u( O( U. J: [: q9 l; Y( u
: E8 z# S3 e. r, n* d8 @ modelSchedule = new ScheduleImpl (getZone (), 1);( W# X: M9 Q: B# h- T& ^+ `) \
modelSchedule.at$createAction (0, modelActions);: ]* j. z& j2 K2 `. B
( a- u; o0 ~# C2 @7 l8 b- n
return this;
* B: I/ i! y6 f& [1 V } |