HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
: s; _$ A( Q2 D5 O
4 ?; U" u/ D u3 R7 M/ _ public Object buildActions () {: k# j+ |& ?8 f1 v* J6 U9 a4 t/ `8 u/ @
super.buildActions();# F! T& S$ K4 l. f
; f A9 b% n) l! g. `
// Create the list of simulation actions. We put these in
; ^3 ~- s4 D; l- U# t. ` // an action group, because we want these actions to be5 l# `: y3 U7 I8 x# _2 K
// executed in a specific order, but these steps should3 X+ f$ x% F% Y6 _& ~+ K6 x
// take no (simulated) time. The M(foo) means "The message
2 s4 h( ] X/ I" [ // called <foo>". You can send a message To a particular
* \6 d% `. u- a' o: j; i // object, or ForEach object in a collection.
! u5 `" B8 @1 F; k
# O5 W( n, K2 f% X2 `. H. E; Z // Note we update the heatspace in two phases: first run8 y# W% x b2 a) U: S8 \* P
// diffusion, then run "updateWorld" to actually enact the
6 ` E1 e7 ^4 N$ ?. ?7 l9 @ // changes the heatbugs have made. The ordering here is- L3 X: J' b+ l2 x9 `: Z* h6 d( w4 d
// significant!
, I! H- R# B" _1 v- F/ u7 e
) ]3 b/ Q& V. L6 l, Q% k4 @ // Note also, that with the additional( Y. L1 M; G+ u
// `randomizeHeatbugUpdateOrder' Boolean flag we can8 c8 s" v% q2 B* Y
// randomize the order in which the bugs actually run- B% _% Q: k$ g0 @7 d6 J2 A
// their step rule. This has the effect of removing any
8 B( v+ B9 T P$ [ // systematic bias in the iteration throught the heatbug
2 s5 d" r9 W6 q // list from timestep to timestep
% j3 n1 Q" K/ p' r. l' n9 P( n( L1 ?! s$ t 5 g$ F! u4 R+ O1 g8 t; A7 h: T
// By default, all `createActionForEach' modelActions have
4 L" Z5 I9 c* U& G // a default order of `Sequential', which means that the4 I! e$ A& U* H0 C5 H
// order of iteration through the `heatbugList' will be( q( o" d, _$ C; ?
// identical (assuming the list order is not changed
* a, Q$ H5 x& ?& Z // indirectly by some other process).0 m6 O' ]# e5 R$ e
5 w- s. V; t4 R% A+ p: Z, E: T modelActions = new ActionGroupImpl (getZone ());% H4 T0 X) n$ p& M [
2 |- O4 ^4 s0 a- } @ try {
6 P5 U* q) Q4 o1 [ modelActions.createActionTo$message
1 b; j1 @' s- F8 V& Z: ~ (heat, new Selector (heat.getClass (), "stepRule", false));
: h$ l8 L# @% X, D& u6 C } catch (Exception e) {
/ G5 ]3 L9 j4 P$ d% F2 @ System.err.println ("Exception stepRule: " + e.getMessage ());. ~3 O/ p, ^. {" p+ x/ C! U3 K6 J
}
. F7 S3 I/ g4 H3 i# S9 x$ {
% s$ S1 A$ n2 y. Q8 z try {
* o+ R& E8 D0 v4 X Heatbug proto = (Heatbug) heatbugList.get (0);4 ~$ ?+ |( x2 g0 `5 J$ E f$ t0 z6 x
Selector sel =
& P& p5 g7 ^, Z, y) b new Selector (proto.getClass (), "heatbugStep", false);
/ b7 ?. l+ y: f( Z actionForEach =
6 o$ n3 N9 E& h1 P P modelActions.createFActionForEachHomogeneous$call
$ X) g C# Q" h (heatbugList,: }& n8 h% e3 b! v- H& f; P X
new FCallImpl (this, proto, sel,: r: l# A. }* S, e, S' p5 K! B
new FArgumentsImpl (this, sel)));0 @3 g0 }# X) `
} catch (Exception e) {4 K5 T/ \; n/ h1 f8 c, A4 k7 m
e.printStackTrace (System.err);
, X6 [9 I( r% h9 r }
7 x+ P: O$ O7 F# ]' Y : c8 K* A- g- F h" @/ ?
syncUpdateOrder ();
8 C3 t/ I% T0 |5 i9 I! p& ` Y, e% v# E, J% {. A" T- o$ O1 `
try {( A- b \/ [) }
modelActions.createActionTo$message
- c4 {2 c) ]! J (heat, new Selector (heat.getClass (), "updateLattice", false));
1 c0 U! c) z: Z/ R* v) Z } catch (Exception e) {
8 s3 M. R8 P6 X) H' A System.err.println("Exception updateLattice: " + e.getMessage ());# b9 C7 z! k5 h% J3 g# Q9 }
}) `, Q. E5 _+ T/ d/ S' _$ Y% j4 u- n
1 L+ i/ a9 ^, a: X // Then we create a schedule that executes the
7 C: c2 W- X2 O2 F( V) u6 ? // modelActions. modelActions is an ActionGroup, by itself it
$ R$ k- p9 F8 M+ d" h+ C // has no notion of time. In order to have it executed in( f _& O8 c/ |
// time, we create a Schedule that says to use the5 M$ y4 X3 ~% m
// modelActions ActionGroup at particular times. This
6 J6 d) q; z1 x // schedule has a repeat interval of 1, it will loop every- h9 c! g3 r. y
// time step. The action is executed at time 0 relative to0 \; b6 K0 u% \( [: }: o) b% D0 j
// the beginning of the loop.
" d2 i! [+ n a. p! d" ~! o8 O, L
3 A( m l) F& t% v! H // This is a simple schedule, with only one action that is
; h% E# D7 V a& W6 j. i2 o // just repeated every time. See jmousetrap for more" g6 {( W: W8 ]: O# A
// complicated schedules.# ~. _, {! J' v4 H
. @0 I, ^1 O$ m modelSchedule = new ScheduleImpl (getZone (), 1);9 @( Z/ X; X4 r5 T
modelSchedule.at$createAction (0, modelActions);
E! L( y4 v0 v% ], L
- {( q: k" `1 j" x0 j8 M return this;
# e- _" h; O, [3 e- x3 d } |