HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
4 D* y: H7 A4 p1 @( _
( q8 E f3 a; V* y% u( t public Object buildActions () {
2 ]& ^. s B8 X% R/ F9 L; [ super.buildActions();
0 {- t0 V) o5 B* f H' y
% p9 o, W3 }! x# ^! s8 B // Create the list of simulation actions. We put these in
' R0 V l. D9 N; A6 ~7 }% T, e // an action group, because we want these actions to be
5 Q: O) Z& J* m& ^) Q) H) z$ a& H // executed in a specific order, but these steps should
5 i9 E t( e& M* J8 O* I // take no (simulated) time. The M(foo) means "The message
5 f1 C$ R/ R/ U! z7 k }! M // called <foo>". You can send a message To a particular
" i6 Q8 \5 A, s* f // object, or ForEach object in a collection.9 I+ L- @2 ^& f; r7 z; K
" s8 T2 x+ `/ n
// Note we update the heatspace in two phases: first run5 b* g3 S* V4 q! c# M! w9 x! c4 G
// diffusion, then run "updateWorld" to actually enact the) J+ m" }% `" [9 h7 @
// changes the heatbugs have made. The ordering here is
$ ~9 |4 A- w" l) F4 b; n // significant!+ n. H5 o" K4 N" K, L4 n9 I! K
7 Y" ]) ?) V+ ]" l9 q // Note also, that with the additional6 T3 Z. R) M- g
// `randomizeHeatbugUpdateOrder' Boolean flag we can! m3 i, `; M7 p* S- G$ w* }
// randomize the order in which the bugs actually run1 A: G" }+ k' F7 W
// their step rule. This has the effect of removing any6 L5 `1 E# r% e9 o& J8 ?& M
// systematic bias in the iteration throught the heatbug6 Z* z* G$ s9 F$ Z% F+ y+ D
// list from timestep to timestep" q4 r5 Q/ F8 s/ e7 s/ ]) `7 D7 Y; p3 I
" y8 E3 r# s* Z# |. ?* A: N7 d
// By default, all `createActionForEach' modelActions have/ U1 o3 P S1 u2 v( t
// a default order of `Sequential', which means that the: a5 ^" u# l0 P+ p
// order of iteration through the `heatbugList' will be
/ N3 u* J3 l; t; a% T0 Q: h // identical (assuming the list order is not changed
6 M0 A% O4 M& l# u0 K8 u // indirectly by some other process).
. N* E' u; c. h- E, B' C1 `
8 F- K1 R1 N6 j, o9 b( U, C5 ^ modelActions = new ActionGroupImpl (getZone ());# p n, M0 P6 }7 \* ], ^* E" Q
3 k# h1 l* _ i" I! G+ k+ J) r try {
% Q3 a3 P( ] h- x modelActions.createActionTo$message5 p( V! [2 w! B/ f& D) j& R
(heat, new Selector (heat.getClass (), "stepRule", false));
- y- [: }' }) ^1 z: k4 n } catch (Exception e) {
+ u# K0 r* n/ i/ @$ v' h4 f/ z System.err.println ("Exception stepRule: " + e.getMessage ());
( R( _; O3 F, K5 { }# O" L8 s2 Y* I/ w# I. L" c! }2 W
. Y& {5 H# H. b) w
try {8 y3 z! i5 o$ i9 U5 m8 X* w- d
Heatbug proto = (Heatbug) heatbugList.get (0);
( u w1 c# I* v4 \% s6 F Selector sel = - C( }) u& f! \+ Z9 u+ H: v. U5 N, ~$ j
new Selector (proto.getClass (), "heatbugStep", false);# L( o) N5 d: M7 C" s
actionForEach =9 U8 ^0 n* H$ h% K; b9 y b( s
modelActions.createFActionForEachHomogeneous$call
g" b. i. A, E: v0 | a0 a% c (heatbugList,
1 K/ h% q$ P) P/ ]5 K1 T0 I) E+ f new FCallImpl (this, proto, sel, I/ ^2 s! O1 Q7 S Z
new FArgumentsImpl (this, sel)));& c8 t7 n+ F, j2 ]; f2 K
} catch (Exception e) {. b+ M7 R1 X/ a+ j" ~" @
e.printStackTrace (System.err);2 h( A9 B' I& @; v8 S% j% A% X
}+ j7 x3 _9 M' Y/ m! w/ k: g% I. ^
n! U/ Z9 J- A* b1 X! z' ? syncUpdateOrder ();# P, ]4 l, `: ~) Y# ^% `# |" p6 [4 }, O
& b1 H% y2 ~7 _ try { K$ g: @4 ]- @- ^- i
modelActions.createActionTo$message
/ D/ Y6 B; j' S2 c" Z ` (heat, new Selector (heat.getClass (), "updateLattice", false));$ J! h$ A- ^# J3 K! M; L3 M
} catch (Exception e) {
1 |6 @0 w1 R4 c* N. D& f$ L System.err.println("Exception updateLattice: " + e.getMessage ());2 O' }. P% [ g4 T' R$ V
}* T- t0 O/ M- L) |2 I5 f, M, A
@ d* Z4 a1 S; ?+ N2 z // Then we create a schedule that executes the5 o6 o6 `8 C+ p; {8 _
// modelActions. modelActions is an ActionGroup, by itself it
% I, n* t8 N4 V. h // has no notion of time. In order to have it executed in
) S4 M1 \7 b1 [2 _! n6 q { // time, we create a Schedule that says to use the9 w& w. F# _9 e) H3 R
// modelActions ActionGroup at particular times. This" J) @: R) b/ n- D( A. e0 T+ @+ V
// schedule has a repeat interval of 1, it will loop every
4 \; S6 r5 R" f // time step. The action is executed at time 0 relative to
& y1 w& I% h9 Z7 C4 {: J // the beginning of the loop.
. g+ t# X' @/ F1 _% E' [- \$ S' o0 e
// This is a simple schedule, with only one action that is2 s5 C% [, m! u% n, V& \. _
// just repeated every time. See jmousetrap for more' Z- j4 u8 h( ?2 g& c
// complicated schedules.
# ^- {! H7 {: g7 ?- { + n' R7 K; q6 a* j
modelSchedule = new ScheduleImpl (getZone (), 1);
2 d; n3 n% P d/ _) J modelSchedule.at$createAction (0, modelActions);9 A& K0 H3 U+ ?9 x8 O* R' @
, l: G) b- i+ j& @/ L u5 s; z return this;% U* M# z7 m% d1 b
} |