HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
+ s' A I9 m: U
* B( o: N2 G1 b4 q- M public Object buildActions () {7 m! B* b5 Y! g# y/ t l) ^
super.buildActions();
y$ T: z. N5 n' H$ _& g& Z
/ T1 `+ R& r6 e& \/ U0 J- j // Create the list of simulation actions. We put these in5 K! Y+ P# t3 i1 J$ j" w3 W
// an action group, because we want these actions to be( ?! M A; {' H2 s; k/ S+ R
// executed in a specific order, but these steps should% @; s9 U: J7 ~6 K. `$ g0 N
// take no (simulated) time. The M(foo) means "The message, U% r- x4 g. |- w& h. v. b7 N
// called <foo>". You can send a message To a particular; C z4 P8 ~2 ?
// object, or ForEach object in a collection.
' V! {" |9 L" _, F6 [
: w# i z6 E. e m7 f) \) F; k2 | // Note we update the heatspace in two phases: first run
* }! W. ?* r" ~: x! F // diffusion, then run "updateWorld" to actually enact the0 f2 C/ a9 ?. X* S' D. E g
// changes the heatbugs have made. The ordering here is
, G8 c( `3 P# j( V9 V2 Q9 l" o // significant!
+ I0 T5 ?( ^9 h5 O! l/ }
" Z9 l1 r; U" O9 }. A! V7 M // Note also, that with the additional$ ]6 H- g( a" O- S( n1 Y/ ^' X
// `randomizeHeatbugUpdateOrder' Boolean flag we can: b3 H: {" w* z, @
// randomize the order in which the bugs actually run4 d2 U1 A5 Q/ G; W) V) ?! n
// their step rule. This has the effect of removing any5 Q G- p. B7 B3 x' M& V0 M
// systematic bias in the iteration throught the heatbug
% [. i! Q+ P- K) \9 \9 P2 A7 G // list from timestep to timestep- e5 G( q9 |; f
7 t' H, L; v& d
// By default, all `createActionForEach' modelActions have
m V4 H3 i9 O // a default order of `Sequential', which means that the
! w) N1 f1 r" B4 N // order of iteration through the `heatbugList' will be5 I; {0 M$ {+ ~; }, |3 i; [
// identical (assuming the list order is not changed
. X' X8 Q: X1 I* R' @" r // indirectly by some other process)./ {9 ]: Q- L' I3 G/ T4 V
2 e- M3 Y( p' ^. X6 r- Y: g# o modelActions = new ActionGroupImpl (getZone ());
# N; ]0 u: K+ Y* Y1 g- ^. b
' p! |) C. P# g" X% K! q try { m2 p2 F8 v7 r8 @6 m. ?
modelActions.createActionTo$message9 ]% t% o* K; |, a: _% w6 U
(heat, new Selector (heat.getClass (), "stepRule", false));5 X; z6 n* l4 C
} catch (Exception e) {
+ |0 A0 ?; Y8 P System.err.println ("Exception stepRule: " + e.getMessage ());2 ?: |5 m' h4 V
}
: g; B( w+ l p' Y, |1 V
4 J+ @: M( a, M/ S$ I0 F try {
) D! M, h% K: K( q5 J; O+ \7 f Heatbug proto = (Heatbug) heatbugList.get (0);
% P" N9 q: _: R! V# o; |! i9 f Selector sel =
: ~( ^0 z3 O% _! ~ new Selector (proto.getClass (), "heatbugStep", false);
+ Y8 g v+ J2 j7 \: X actionForEach =
& {4 V9 R3 |: S/ Z6 N, Q modelActions.createFActionForEachHomogeneous$call7 l. J5 K% I6 W4 L0 e
(heatbugList,
1 Q1 i X! i. o" V% a1 _6 I1 E new FCallImpl (this, proto, sel,
8 ]* P( \) W1 ?" l0 C8 B# M% K new FArgumentsImpl (this, sel)));
9 b' H( s6 |; l; D% ^ } catch (Exception e) {
' ]. z7 z" i" _1 X2 I! ~( J e.printStackTrace (System.err);" }6 |2 v3 W4 a. U+ H$ S" S6 J
}
/ x: k& \0 R3 Q2 F7 d# D
" {0 m8 N& G; N' K4 @4 |3 g syncUpdateOrder ();
: g; E; Z* ^- G2 g! k" L
! T0 B8 _9 s! j* k# H# { try {
+ U- o& R6 V; P7 X modelActions.createActionTo$message + J; c7 ^- o5 Y8 A5 }
(heat, new Selector (heat.getClass (), "updateLattice", false));
4 r: U9 _' J( D+ ~ } catch (Exception e) {4 N, Q: F L Z1 v- m
System.err.println("Exception updateLattice: " + e.getMessage ());: X; _; f; m7 M4 [: z, Y" k, u* u
}
, o2 @2 c+ W; v" D- L; W
, r# E. F$ H7 B1 U1 `0 z+ i // Then we create a schedule that executes the, T2 l" p* Z/ J! t
// modelActions. modelActions is an ActionGroup, by itself it( Z! P1 q4 S- G4 q3 f' K
// has no notion of time. In order to have it executed in& |+ ]% w/ d- u' V7 O- A" B+ e
// time, we create a Schedule that says to use the' X0 L: u. c* J5 q5 a
// modelActions ActionGroup at particular times. This
- d) s' e& U3 i // schedule has a repeat interval of 1, it will loop every/ c# d! Y& \9 k* A* V
// time step. The action is executed at time 0 relative to
/ B' H" s% j- D2 A7 `, i& H // the beginning of the loop.: M3 O7 d4 {" E. M3 Q
7 ~, s* O' Z4 L3 ~2 B
// This is a simple schedule, with only one action that is2 {$ |% A7 ~) [$ F# D! j2 a8 k
// just repeated every time. See jmousetrap for more
! w& N5 ]; N9 Q1 p( A+ {- _0 G // complicated schedules./ f9 m" d2 Q& w- z0 a! R4 b) o
9 h: j' w; \: R: v; C- ] modelSchedule = new ScheduleImpl (getZone (), 1);
, N- R! ?$ R- t7 r4 C9 f modelSchedule.at$createAction (0, modelActions);
( s* r; K+ L& X" ] w / f% o6 G5 i6 _; j* t
return this;
) l# X4 e5 c2 n: F- I' h: S } |