HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:7 r A/ O4 Y3 L2 Z
- R2 C' B" b) M6 K& E$ F
public Object buildActions () {
3 s4 v# U/ w! U1 T" D. q* g1 L super.buildActions();
- m( S# t3 C" ]2 Y7 w+ B; ~8 D/ d+ o ) r4 l0 O1 |& o$ b" y# V$ w
// Create the list of simulation actions. We put these in
9 `2 q+ ?+ j. e7 p5 D& t% d; d // an action group, because we want these actions to be: x) ^7 j `% V+ S& T
// executed in a specific order, but these steps should, T7 j/ n: K! a; c4 [
// take no (simulated) time. The M(foo) means "The message
0 Y) [' Z$ m5 L e. `; z$ x // called <foo>". You can send a message To a particular
" G1 E! g) V4 m9 b8 F! L2 a // object, or ForEach object in a collection.
9 J/ v9 f' O m# v1 v1 R
; U. C1 @' F1 A( O // Note we update the heatspace in two phases: first run: G: e8 C+ |/ _
// diffusion, then run "updateWorld" to actually enact the# a. t) ~/ s4 m$ I5 V: |, @
// changes the heatbugs have made. The ordering here is: B9 l6 u# ]( X4 e: N4 t1 s
// significant!
& a2 [* O8 p |7 y, ~6 z8 C( P
# S" l P' F& k9 j4 {' N- s // Note also, that with the additional
/ X" f1 U" }. L/ W! |* { // `randomizeHeatbugUpdateOrder' Boolean flag we can
$ z1 T& E6 ^& P. s& C$ B // randomize the order in which the bugs actually run
# e! ]5 p1 I v; Q* S" @ // their step rule. This has the effect of removing any
( ^2 G+ K: w. g2 \3 F7 K! @( a // systematic bias in the iteration throught the heatbug' {3 h; e) g3 G3 D$ s
// list from timestep to timestep' X4 I* L' B$ \% V ]
5 `, q8 J' t) H6 T7 @" r. ] // By default, all `createActionForEach' modelActions have
8 N+ p5 J1 y4 R3 y // a default order of `Sequential', which means that the# S# @# C& A8 @4 S( ^ ^7 ]
// order of iteration through the `heatbugList' will be! Q. }& [( o7 ]) ^3 R
// identical (assuming the list order is not changed
2 `5 r2 r+ I5 E1 {1 { // indirectly by some other process).' y* Y+ r* q. z- _9 P& J* n
0 b) F j& m) O9 u modelActions = new ActionGroupImpl (getZone ());/ @; R. Y, w1 g9 G, p4 ~
0 |4 n6 h, y# d0 w try {7 K2 S' D. s) |1 `, m- C" w. c0 q
modelActions.createActionTo$message
, n" X" \/ `1 {8 \& }6 i (heat, new Selector (heat.getClass (), "stepRule", false));
4 J! d7 x3 @# ^( v } catch (Exception e) {: R4 M: b5 i) Q+ e' D* d: K6 Q- o
System.err.println ("Exception stepRule: " + e.getMessage ());
# [4 D! e/ z3 c5 C7 h6 k* n7 P }
4 }3 \, @% t5 H8 U; Q+ m* d) B/ L, H" J$ c V0 r! y* T2 q/ `) Q
try {" n/ T# K4 l& V" i7 y
Heatbug proto = (Heatbug) heatbugList.get (0);8 K: I' n2 e) h; G- Z! Z( m6 c8 W
Selector sel = # s. e8 r% F% ^( |2 P* u$ v: t8 C
new Selector (proto.getClass (), "heatbugStep", false);
( g$ F0 A7 A' ~( o6 l actionForEach =, v# B5 X, ?$ } y2 ^
modelActions.createFActionForEachHomogeneous$call3 v( o% Z0 F/ T
(heatbugList,
* `; b$ h4 c$ w! {& y new FCallImpl (this, proto, sel,& W8 o. J+ f: O( g. y2 I, D
new FArgumentsImpl (this, sel)));+ a+ u! { F. |/ R2 j
} catch (Exception e) {
5 N" X) X1 H# G) z9 j e.printStackTrace (System.err);
0 b. ^! b: @' T5 R/ c }
( @- O; Z7 s5 _* o$ i5 M
; N' d% S/ H& F$ l0 A' m6 ^ syncUpdateOrder ();
4 i& C3 d6 U1 A) C8 p i8 U% @1 p( I$ w1 D- x+ _ B
try {
2 W0 y5 o/ n& e modelActions.createActionTo$message
* f+ _+ o. w4 K; p7 X2 G (heat, new Selector (heat.getClass (), "updateLattice", false));
4 F3 w- D8 f& n# O# u } catch (Exception e) {' R3 i9 E- g- o; q* E2 H2 T$ \7 p2 I- M. v' Y
System.err.println("Exception updateLattice: " + e.getMessage ());% o; p9 S" S/ E6 A* p# u; t
}
, `) ~; o: A! f1 R 6 r- d% U4 {6 Y2 f3 Q
// Then we create a schedule that executes the
* W, x# A! ~6 t // modelActions. modelActions is an ActionGroup, by itself it! P: }" v0 I! D/ ~
// has no notion of time. In order to have it executed in
2 ~4 s, t9 ]5 [. o // time, we create a Schedule that says to use the
# C2 b7 x/ v- F: R // modelActions ActionGroup at particular times. This
9 D/ w2 y1 c; x' P" r. R // schedule has a repeat interval of 1, it will loop every5 j& Y& D# I- P$ V8 {7 I p
// time step. The action is executed at time 0 relative to8 A1 `5 F# P4 d0 H/ w
// the beginning of the loop.' ^ N' c) t1 q0 j2 _: ~/ B; Q5 ?# ?
$ R( ] c* ?: a2 d // This is a simple schedule, with only one action that is+ Y+ a* g) q G$ f/ U; M
// just repeated every time. See jmousetrap for more, H" ?5 W; l4 a
// complicated schedules.) \9 \1 e6 Y% ^; v# T; }: x9 `
& u: B) v" N+ O! Z
modelSchedule = new ScheduleImpl (getZone (), 1);5 s0 q! W' f) ~8 s% ~! w; Y* {
modelSchedule.at$createAction (0, modelActions);3 q4 v3 i& a7 p+ _$ b0 p- ] Q
, X% `# T% s! B% \) d
return this;
) g8 Z. X7 _% m; l2 V: P } |