HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
# D: I- o) t* s8 G7 c% T& E4 S9 _8 x5 c5 |
public Object buildActions () {- j6 S- p2 u( e$ O8 s4 D1 H
super.buildActions();
5 I9 y5 y9 e8 k) M& S5 V ! i! `' j' @, Y0 r/ G( B
// Create the list of simulation actions. We put these in
! w: {. U5 N4 m$ Y7 T" f& j) u. u // an action group, because we want these actions to be
! H6 g, F7 ]# f. s+ N // executed in a specific order, but these steps should
3 ?9 d; c3 B! T // take no (simulated) time. The M(foo) means "The message5 }/ }! K- |8 H, m7 C. C& S
// called <foo>". You can send a message To a particular% Y ?# ^- ?- M0 u/ V+ D! f
// object, or ForEach object in a collection.0 r: V. f1 B: K; T) H! k
! x, [" d% \; p7 ~ // Note we update the heatspace in two phases: first run
/ X/ Q8 g$ ?0 X) Y* j' { // diffusion, then run "updateWorld" to actually enact the
: u# F( ~6 F+ S t, g1 t+ l // changes the heatbugs have made. The ordering here is
& V6 E j8 y* N9 q // significant!
! ?& I, ~& R( Y2 D, Z. L
# B/ d8 s& e. \ // Note also, that with the additional1 z# `: J" k8 U/ A7 U x% c8 N9 K
// `randomizeHeatbugUpdateOrder' Boolean flag we can, [8 ~9 d+ |& w, `. O% \2 s
// randomize the order in which the bugs actually run
) [0 ~6 O" a& r3 W* @( n // their step rule. This has the effect of removing any
5 \( L) K5 E7 K# {6 t // systematic bias in the iteration throught the heatbug4 d. }# e0 z. ~. o: U: B! {0 |2 j6 ?& e
// list from timestep to timestep
8 }0 N: [6 R$ @# \+ \ ! c5 x% G; d1 D
// By default, all `createActionForEach' modelActions have R1 m6 P1 E( [/ a& T+ e" I5 K K' W
// a default order of `Sequential', which means that the4 l' s+ F8 N5 ~5 e1 t
// order of iteration through the `heatbugList' will be
9 r6 c6 K A7 Z$ W // identical (assuming the list order is not changed
9 x* n2 Y1 F4 x0 J+ t3 l) P // indirectly by some other process).
8 Z3 k# C9 s/ b" T; {& F * X3 g3 A- \4 ]1 A, H7 d
modelActions = new ActionGroupImpl (getZone ());8 n4 ^, h4 A8 Z. x8 a
3 b* B; B* j, F# `; ^+ Z try { m! k5 L/ `# D2 ^! H1 v4 C4 t
modelActions.createActionTo$message+ X/ @+ {) `8 V, h7 O
(heat, new Selector (heat.getClass (), "stepRule", false));* v2 t6 t7 Y" `2 x. v$ ^" Y* w
} catch (Exception e) {
# H' u. a# x1 x y System.err.println ("Exception stepRule: " + e.getMessage ());* r2 |* W" s, y+ ~8 c
}
a- C3 R5 D; A# F* H! O, L2 o: t) g- d2 `9 n" g6 M$ H
try {3 `0 |8 ?% v+ ^4 ^$ a; u
Heatbug proto = (Heatbug) heatbugList.get (0);) y6 x: e! z9 I$ q# a a
Selector sel =
2 } H% }" C& v/ a: Q8 D new Selector (proto.getClass (), "heatbugStep", false);9 r* V8 g: ~" y0 e, R
actionForEach =
- u y3 f- [5 A P. L/ n modelActions.createFActionForEachHomogeneous$call
7 s/ ] |5 I& i6 f9 |2 s (heatbugList,4 ^% q8 ]) ^( u
new FCallImpl (this, proto, sel,
/ {5 `+ }, L( P! V new FArgumentsImpl (this, sel)));
5 {, o6 o( L' n% d# m% x } catch (Exception e) {
T! R' _( l- ]& E, o. z& `! v e.printStackTrace (System.err);8 K& i5 Z& O+ L. [8 O
}* j/ q9 v% A+ G, `- s
6 f" l% _, g' X7 c( |! A) Z( O
syncUpdateOrder ();9 |# t% n9 t, p+ C \
V4 ^& F6 _, O" B# l try {
: E! R }. q! K0 X2 ?# P modelActions.createActionTo$message
6 j& l) V; n# D# W (heat, new Selector (heat.getClass (), "updateLattice", false));: C( j P+ D# C6 x, V
} catch (Exception e) {
' ~) B" _# @0 X1 K' u. c1 F System.err.println("Exception updateLattice: " + e.getMessage ());
: `7 Z6 O/ `5 S \* h6 [ }0 Q1 Y- H) x! P* o
8 \# r( W7 A* r/ W7 ?/ g# ` // Then we create a schedule that executes the5 `! a/ E9 e- w% y0 B. o2 h
// modelActions. modelActions is an ActionGroup, by itself it
+ ?" n( m; u$ T* ] // has no notion of time. In order to have it executed in
9 J! I; F$ t) |. w. ^9 {# Z // time, we create a Schedule that says to use the' b& C- {1 B8 d* u1 K& q( x1 H
// modelActions ActionGroup at particular times. This
1 F _' j! N9 g& b // schedule has a repeat interval of 1, it will loop every% Z' x& N% }" n* c! v X) q- D! c
// time step. The action is executed at time 0 relative to/ s3 K1 J' C" |) a& _: p
// the beginning of the loop.1 D/ T2 c7 J+ _: e2 J$ {
Z ^7 M% \4 A+ V // This is a simple schedule, with only one action that is2 K( d' ~& o& [! M7 d( \* @, \
// just repeated every time. See jmousetrap for more
6 h( U6 m+ h+ h! J // complicated schedules.
4 }+ T: ^" j- G6 h) y/ n) n. o1 v 4 d9 G' f5 Z6 w" [# \: e' j' W
modelSchedule = new ScheduleImpl (getZone (), 1);- y' t' F0 F0 w3 O5 s# h9 O
modelSchedule.at$createAction (0, modelActions);
* V5 j& o$ C9 d9 D% y" z- f& _9 z( {1 U , k! S: d2 H- _2 g: [# M3 h
return this;) w* p. w) T0 {
} |