HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
' d4 |0 g# l1 N7 s, R1 O. U H4 D3 @ K* m0 L
public Object buildActions () {
. A* n8 R% q0 c: @ p i5 b2 U super.buildActions();
1 K- }0 v8 t; y 9 {; B# J# K9 a. K1 v& T
// Create the list of simulation actions. We put these in
. G% x9 ]; r8 U2 }5 \1 \ // an action group, because we want these actions to be
3 r+ P0 @$ ~( u# G // executed in a specific order, but these steps should
5 w5 A; l8 s# p7 f! i // take no (simulated) time. The M(foo) means "The message8 T5 [& ~2 t, p% c. J
// called <foo>". You can send a message To a particular( K7 H! t5 @" [3 F6 d* H( F1 d
// object, or ForEach object in a collection.
3 v5 l5 D* N5 [2 C
+ c A! g. V8 e5 L* Q+ v/ |) K // Note we update the heatspace in two phases: first run
# [4 A" P8 g: Y* |2 Y // diffusion, then run "updateWorld" to actually enact the! g. T5 R6 [* ]) t/ z/ A0 ~- L
// changes the heatbugs have made. The ordering here is2 b' N& F. `" A3 X L2 `; v7 n
// significant!
% X. U7 l2 X) V' g8 T) `
% H+ v T8 U! a$ p( H // Note also, that with the additional
- {/ S C4 ^ \8 k4 P; P( w) N // `randomizeHeatbugUpdateOrder' Boolean flag we can5 l3 Q( ^$ J h, n% F% C, U
// randomize the order in which the bugs actually run/ H( s% ]/ c0 K4 m9 T" T8 q( D
// their step rule. This has the effect of removing any
3 T8 _+ W7 P* d; V* F: w+ K( [ // systematic bias in the iteration throught the heatbug
- R; u* L9 U+ ] // list from timestep to timestep5 Z7 g5 b3 n( k2 {2 N
1 q* t2 \+ e3 M
// By default, all `createActionForEach' modelActions have
! y4 X" R; f! z" k# Q. | // a default order of `Sequential', which means that the7 m' B( J- Y5 @% N1 O
// order of iteration through the `heatbugList' will be
$ C- H7 |. X/ Y. R; G+ t6 ] // identical (assuming the list order is not changed' u2 i3 l( M0 H$ [6 h3 D
// indirectly by some other process).: L' P+ `# C3 m: _; U( L" t: [
) R6 c3 V7 o8 C4 z* @/ I W1 `
modelActions = new ActionGroupImpl (getZone ());5 ~9 R5 f9 a1 L1 K p3 I2 n
& o% V0 f9 f: R# D- f$ V try {
. L$ Q" o3 M* e0 U6 L7 h E. z modelActions.createActionTo$message3 q' R ~7 w2 d! R
(heat, new Selector (heat.getClass (), "stepRule", false));
% N. c" N I. [9 W! `: `7 k2 o ` } catch (Exception e) {9 N* _' f: `1 W! G
System.err.println ("Exception stepRule: " + e.getMessage ());
7 ?# p; J8 B1 L4 D% q6 Y1 N }% B, f+ A: r% }1 w
% }' ]7 q3 m( x, s& Q, [/ k try {
9 v; H6 O: f. g" V' ^/ e Heatbug proto = (Heatbug) heatbugList.get (0);
7 s: ]4 y. n- d Selector sel =
" W; t0 `4 ?& f# O2 r new Selector (proto.getClass (), "heatbugStep", false);4 D, C8 c* |' k: F
actionForEach =
) g0 N: W* w3 A; l9 ?/ ~ modelActions.createFActionForEachHomogeneous$call
1 ^+ ~9 ]- ~: s3 [# p (heatbugList,1 H0 d9 O. u# N- {2 X8 l# J
new FCallImpl (this, proto, sel,7 `+ N( b$ A" a/ d) z6 o
new FArgumentsImpl (this, sel)));
( } F- S# N o3 n. s" }3 @ } catch (Exception e) {( C3 g' a; n+ J& L+ ]
e.printStackTrace (System.err);
7 ~) k3 d5 Y0 _9 M; E, f8 M }
: j9 r' @) n7 Q ; i. O. T9 A7 X1 M! X
syncUpdateOrder ();
4 ^) M. ^9 W! a u, Y5 k O& [& I4 }6 m7 C0 t8 |/ \
try {
3 I4 E: X# [% b2 N3 e% ] modelActions.createActionTo$message
2 W) D- c) p% G! F (heat, new Selector (heat.getClass (), "updateLattice", false));
; m7 P+ T; f( N- z } catch (Exception e) {
4 |. c: ^* C @8 B3 ^' n1 a System.err.println("Exception updateLattice: " + e.getMessage ());. A, s% }, Y$ m
}
. R E& \6 i4 G* K# N/ _$ ^
8 j: m& C6 S1 d" @# W- L // Then we create a schedule that executes the
9 G) [' P( E; Y" L$ h+ |1 S // modelActions. modelActions is an ActionGroup, by itself it
* {) O0 E+ x" F) F // has no notion of time. In order to have it executed in+ I+ Q+ {. D9 A9 x
// time, we create a Schedule that says to use the
) G. r' h, ^4 r4 J/ B/ T8 q // modelActions ActionGroup at particular times. This
# N0 X5 |2 @- M. S // schedule has a repeat interval of 1, it will loop every+ q; D( l. f9 M
// time step. The action is executed at time 0 relative to
( O$ H9 p" n8 K3 |' G // the beginning of the loop.
4 H! j: ?1 M9 a$ X' M( H: D& R' S% D
" J. G- Y; O5 t$ m) X3 s z; x // This is a simple schedule, with only one action that is) r9 @2 I6 y& g' x# A4 r
// just repeated every time. See jmousetrap for more
9 d N) f2 x& j // complicated schedules.0 a& f9 m7 v/ X' j
1 \1 Z1 M3 a: n6 o- F modelSchedule = new ScheduleImpl (getZone (), 1); N6 a9 Z9 ~: m
modelSchedule.at$createAction (0, modelActions);% W! w- B( s2 G/ ^# c3 v
/ _ B; t* s* Y' \) a z& Q8 V
return this;
6 C' q- K0 Y" N1 I } |