HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
5 l! s- S* L1 h) L5 D0 A7 N
4 D8 }( x4 x/ {' l- I public Object buildActions () {
5 P3 j8 ^' c. E) i super.buildActions();
6 [7 T" P' f9 B' L- f" L 8 i+ S3 m. z/ A+ i
// Create the list of simulation actions. We put these in
2 ]- L! {. K" Y% e9 j1 w+ H // an action group, because we want these actions to be& K2 P. u1 I7 Z0 A: e8 u: u, W
// executed in a specific order, but these steps should0 P1 o4 g6 X1 D5 r* w6 {
// take no (simulated) time. The M(foo) means "The message4 g, i" T7 v# m; e- @
// called <foo>". You can send a message To a particular# H. H- j* T6 t+ y
// object, or ForEach object in a collection.- g0 b, }/ q" J7 o. p3 D6 Y+ u
L( o: G& Z- w" I/ W. W$ F8 j5 m // Note we update the heatspace in two phases: first run" j, t; O/ p/ \& n/ d. ?5 E" g
// diffusion, then run "updateWorld" to actually enact the8 X* F- J; h& f8 L8 u
// changes the heatbugs have made. The ordering here is7 h" K3 B8 Z @
// significant!& ~& }* g6 a' R
* @( s$ b# s1 e3 G v- F8 v
// Note also, that with the additional
5 L/ h& N2 S0 o; y$ ^) i // `randomizeHeatbugUpdateOrder' Boolean flag we can; G. ^# |9 x+ |3 W, o! x
// randomize the order in which the bugs actually run
/ c+ t4 r/ Y& Z, Y, ] // their step rule. This has the effect of removing any" b& }8 m& I6 B; ^* g5 ~! m3 e
// systematic bias in the iteration throught the heatbug/ P4 `5 s: s1 D
// list from timestep to timestep
! g2 G# Y+ x3 e- I0 E7 J+ a
; p5 {7 V! J) X* P) S // By default, all `createActionForEach' modelActions have
' F% F Q; F4 Q: B# A; w) d // a default order of `Sequential', which means that the
1 F6 d2 z2 K. h // order of iteration through the `heatbugList' will be% H6 z! S' N$ @9 Z4 A' a, U5 f
// identical (assuming the list order is not changed
5 Q3 R$ Y9 G; M8 X // indirectly by some other process).2 D9 h/ ]0 N" _
* j& {. e% G" m6 s! C modelActions = new ActionGroupImpl (getZone ());
8 {5 }) \9 t& J3 T# v) f
) j/ c5 \; q! T# ]/ k; S% Y try {
, f; N' {4 e( [7 g+ m9 ?4 H4 @ modelActions.createActionTo$message
( J6 h/ o) h5 i1 V1 x8 J" H (heat, new Selector (heat.getClass (), "stepRule", false));' N# Y* \; c6 K% ^( C4 A
} catch (Exception e) { B! r/ L8 |9 l. w! {% }1 f* _# g
System.err.println ("Exception stepRule: " + e.getMessage ());) a" U9 f: ?3 l' L$ C
}% ~8 g( z' O p- F
, a0 ]; b/ |0 {% O* c
try {3 N& I4 @* P6 J3 n' q
Heatbug proto = (Heatbug) heatbugList.get (0);
$ W0 d5 @ q1 y7 n, M Selector sel = / T0 _3 J5 Z3 [, m8 j
new Selector (proto.getClass (), "heatbugStep", false);: [( H W2 `/ _" ~$ B3 ^, c5 a
actionForEach =7 w9 M- F, e+ C& X ^
modelActions.createFActionForEachHomogeneous$call
5 i! z+ F" z y: U (heatbugList,4 v `, X8 ^+ g
new FCallImpl (this, proto, sel,# ^; C& \' c" M. l7 Z
new FArgumentsImpl (this, sel)));. T2 r4 a/ B0 Q7 M4 a
} catch (Exception e) {. F( I" e$ D' a5 L) C( Z
e.printStackTrace (System.err);
* S. W" P6 z8 W8 V2 n/ N }
7 z9 b1 D# w0 j. u8 z P , P m1 G: l4 J; C
syncUpdateOrder ();
% s+ N) M% P" D' Q% m* ^" Q' s i+ T+ Y/ B: N5 p& n' i
try {
, i `" a3 u7 G# |4 Q) N; U modelActions.createActionTo$message / Z0 m2 F0 G, v- C' d" O) g' F2 e
(heat, new Selector (heat.getClass (), "updateLattice", false));
7 b$ [% [* g" i9 T" U* U0 Y5 w5 [# A } catch (Exception e) {
( w: g, _& W. G/ J* f System.err.println("Exception updateLattice: " + e.getMessage ());: F2 W& v* `4 T3 P* \$ m
}0 F4 _' {, T: F
( m& h1 i/ Y1 f' K& R5 O; I# W // Then we create a schedule that executes the
/ n8 K7 V0 z9 j6 h9 r X& Y // modelActions. modelActions is an ActionGroup, by itself it9 E+ }, k8 e/ B& O I/ Y2 ^; C- n
// has no notion of time. In order to have it executed in
7 q: U* C; n! {5 n" J/ c1 P // time, we create a Schedule that says to use the
/ A; u; X% G, U8 y* A; b // modelActions ActionGroup at particular times. This6 h8 u8 @) k, G) V' J
// schedule has a repeat interval of 1, it will loop every2 [7 F8 E2 a, s6 m2 U
// time step. The action is executed at time 0 relative to
( ^0 P+ g: T) j2 a3 D // the beginning of the loop.' M2 ^% v% p5 p; b6 U8 L( C
G- l: o) n ?$ I: j
// This is a simple schedule, with only one action that is
u- O Q# ^( p. Y/ ? // just repeated every time. See jmousetrap for more+ i, H! W/ w( \: x
// complicated schedules.
/ w" Z# j( t% _3 W
2 M) u8 ]2 J' d9 V8 \ modelSchedule = new ScheduleImpl (getZone (), 1);1 ?7 R' ]3 i3 P, V( X' H
modelSchedule.at$createAction (0, modelActions);
/ Q/ l5 a% H1 d3 v' M6 a- E
" m' @2 w2 I1 f9 p0 p9 W return this;; Z% i9 c+ ~; J
} |