HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:6 `9 O- `+ h" d" I# i* c( H% P% u
4 M) y! b" D/ D% ]; ^ K2 P+ j public Object buildActions () {1 s+ ~, r6 V$ L# Z5 o* y# O& R9 a
super.buildActions();0 l `3 c8 q+ [' ?3 p4 \
' D% G1 s Q! n. N2 O9 c3 f // Create the list of simulation actions. We put these in
" C( z2 h8 g( u" F4 i+ `4 a // an action group, because we want these actions to be$ O9 k0 F4 H0 x0 S7 q
// executed in a specific order, but these steps should
0 `: ?5 C7 Q4 U/ X2 L // take no (simulated) time. The M(foo) means "The message8 K/ u1 x' q" r
// called <foo>". You can send a message To a particular5 e' ]0 e* t$ [4 x
// object, or ForEach object in a collection.+ W7 C& r4 i# J/ I1 n; C
7 \& \) Z1 Y% s: m( X8 w" u
// Note we update the heatspace in two phases: first run
& d! s4 W: F0 }0 V& e // diffusion, then run "updateWorld" to actually enact the
: E1 n5 X1 b @9 S& ^ // changes the heatbugs have made. The ordering here is. N8 R8 S+ M5 ], C, U
// significant!7 X$ L N2 e. [. E3 d
3 `! F, N6 R( b( ?6 @
// Note also, that with the additional
; s, J% T! q/ T: r( } // `randomizeHeatbugUpdateOrder' Boolean flag we can( l# ^1 W" m: f2 v7 B% X
// randomize the order in which the bugs actually run
" C) i Q! N* r [1 d0 g // their step rule. This has the effect of removing any( _8 R* s4 \+ P) S2 W
// systematic bias in the iteration throught the heatbug
( d' e: }1 L0 O( V. ]# x // list from timestep to timestep; Y8 |3 a% |! P* Y% t
% c4 ~* x0 n4 R) n) {! L: T% r$ R
// By default, all `createActionForEach' modelActions have
$ G9 Y$ D. @5 v- n# v // a default order of `Sequential', which means that the9 z7 k* ?& ~2 z$ I; |3 I6 e
// order of iteration through the `heatbugList' will be7 X: |( z: z" Y. }, F1 D
// identical (assuming the list order is not changed
3 O& U- B+ w. H: n- w7 ~" w$ z' O // indirectly by some other process).
& M0 M0 e9 Y8 T7 m1 t ! v+ H/ W/ e' D2 B( S
modelActions = new ActionGroupImpl (getZone ());$ n, ]8 ]+ ^6 I4 G6 F4 m
$ @+ p) Y# F7 V0 E9 K
try {( j7 j3 {' O3 z" m" e% k0 d
modelActions.createActionTo$message
% I9 u" ?# Q9 b$ L {- {& } (heat, new Selector (heat.getClass (), "stepRule", false));
& X; `' _' @: d' k6 L7 \5 ] } catch (Exception e) {
+ }3 y6 l5 v1 e4 J( z! `( s: `* d System.err.println ("Exception stepRule: " + e.getMessage ());
* O! k" s/ A* S3 W" V* c& ` }( C) k, y0 P" D
9 n! n( c+ u8 k6 ?. |$ s
try {6 C9 c% g6 y3 I9 w9 s
Heatbug proto = (Heatbug) heatbugList.get (0);5 L' r/ q1 q( G' K2 ~) v K
Selector sel = . D) {1 p& v" o0 ~2 l( r
new Selector (proto.getClass (), "heatbugStep", false);( D5 Y9 O+ ] Q6 J3 Q9 o V
actionForEach =/ B# m. n! I. ]3 c: A2 F
modelActions.createFActionForEachHomogeneous$call6 h9 @5 q) n, {6 F; l! A" b' Y
(heatbugList,) J G; R. D) k% w% ?
new FCallImpl (this, proto, sel,
4 Z1 G3 J) S# q; l- `- o new FArgumentsImpl (this, sel)));
" J6 U* Q/ k& v! Z" \: e2 Q } catch (Exception e) {# l# B4 h5 X. `# Q t O1 P
e.printStackTrace (System.err);
- u3 z9 I6 I2 f; t5 u }) _& d# ?) ^7 {2 G* S
' _4 j& A1 p( @, y: r% | syncUpdateOrder ();
1 w1 |( s0 f5 ^. D4 v3 t: v5 `4 s4 i+ k, J
try {- z( Z* c6 g- M& O% t$ B
modelActions.createActionTo$message , X# ], I, f) O+ p& ^" `1 X
(heat, new Selector (heat.getClass (), "updateLattice", false));1 U3 x# [( i4 M9 n0 P3 Q. T
} catch (Exception e) {$ R% g, I2 H) Y6 r' y* \" c' Q
System.err.println("Exception updateLattice: " + e.getMessage ());1 k6 Y: l' x7 L2 y; H
}5 |. S: u/ B( x( D3 c: y' k
! b* M$ q }& u // Then we create a schedule that executes the
% _' J" b) f& `$ [% C // modelActions. modelActions is an ActionGroup, by itself it* m9 C: i8 q7 }+ r( O3 h: ?
// has no notion of time. In order to have it executed in% P) L/ [' c! y# M: ^# A
// time, we create a Schedule that says to use the, I% n$ o! G) o: ^; G
// modelActions ActionGroup at particular times. This
& C* s* d$ i+ l- b7 o$ s- a // schedule has a repeat interval of 1, it will loop every' ^* o7 d; I% k0 S. e
// time step. The action is executed at time 0 relative to
e/ e( n9 ~) c // the beginning of the loop.
& d4 [3 Z9 |* ]7 F; n1 f1 R {% K+ R
// This is a simple schedule, with only one action that is( f. a3 k' G5 R+ v0 E
// just repeated every time. See jmousetrap for more
- f4 D2 l: q- E8 g1 G# N6 b+ z3 e // complicated schedules.4 u8 H0 G M+ w7 K# v
/ ]( I' k) Y) U/ z# A; F
modelSchedule = new ScheduleImpl (getZone (), 1);, A( a+ v( W: b8 X( c
modelSchedule.at$createAction (0, modelActions);, O7 n* c% y- h* P# u
: F4 K, C# P3 m return this;$ N8 S; u# R- \7 A! Q
} |