HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:1 m" U: D( p" ]! R& q p1 Q2 R; g
0 a5 z l- J1 i% B" \* O
public Object buildActions () {
% N6 Y; Z) T6 D% Z+ Z super.buildActions();
; E. t- \; ^6 Q# K5 T" H * {7 Y: d/ Z+ |& @* S0 k; [
// Create the list of simulation actions. We put these in. @* f7 c! H b& b
// an action group, because we want these actions to be
6 N) Z* {7 D( d& R. W // executed in a specific order, but these steps should
2 f3 }. d! n9 `9 d // take no (simulated) time. The M(foo) means "The message5 ?$ H/ P4 K5 L. W4 b2 B7 N& L
// called <foo>". You can send a message To a particular
+ N0 R @8 C8 [& p // object, or ForEach object in a collection.
& r d9 i+ w# v. Q& m1 P/ z. x% F . `! o) E& b6 \7 e* S. r6 e5 W; F* n
// Note we update the heatspace in two phases: first run% l) C3 q$ e2 K# C# X9 F
// diffusion, then run "updateWorld" to actually enact the- ]; }# t# T9 D; ]* o' k, I5 J
// changes the heatbugs have made. The ordering here is
1 f4 ^) J* M# o // significant!, n( P# V7 F2 g) P8 c
; f! N' w( L$ W: b7 i // Note also, that with the additional0 R, T. K5 d) B. k8 D/ B! M
// `randomizeHeatbugUpdateOrder' Boolean flag we can; P$ b) K# h2 q/ z, g4 g( ~
// randomize the order in which the bugs actually run" |5 p' g1 m- N4 A9 ` m$ Z
// their step rule. This has the effect of removing any
5 z" ^1 [) S1 a- g! u // systematic bias in the iteration throught the heatbug7 ?, p! l$ ~/ Y' t( _3 l
// list from timestep to timestep
2 b- Q/ {7 \/ a7 \$ I' L ! G/ w( D r0 C) c
// By default, all `createActionForEach' modelActions have
& \( |2 ^ Y G+ D) Y5 ` // a default order of `Sequential', which means that the
- Z& F) G# M6 I1 E3 T" e // order of iteration through the `heatbugList' will be
v/ k+ Z& s( P2 ^. f& P // identical (assuming the list order is not changed3 y$ }$ L6 |: A( U( G/ Z
// indirectly by some other process).
7 X$ [) r6 s; A6 x3 ]2 m
. ~; A* u- ~3 y, q. @ modelActions = new ActionGroupImpl (getZone ());7 w C* Y: z7 p6 v+ }! v
4 _, K j1 G& \3 s8 {
try {( @0 p" i [: X8 {
modelActions.createActionTo$message k( O- S% O2 R' f* r" T: q. T8 `- G3 m
(heat, new Selector (heat.getClass (), "stepRule", false));0 |4 m6 o* P3 F- m
} catch (Exception e) {3 S6 B! D# ^% x" M5 K4 X/ L
System.err.println ("Exception stepRule: " + e.getMessage ());
5 K! I/ N! l3 N( X& Z$ v8 J, V/ M }
3 S; g' n# F8 w2 m% a' i) l! J) P' P( {% k: _! F7 v/ `
try {
2 G; [4 |0 R1 K) I7 ]7 o Heatbug proto = (Heatbug) heatbugList.get (0); q7 u5 n3 e: f5 R( x% N
Selector sel = & ]- @ X. B$ y7 B
new Selector (proto.getClass (), "heatbugStep", false);
: V" ?) {( n4 ?; \( [; B! q, r) g' G actionForEach =" m2 ~+ M( `0 O- |+ |+ s
modelActions.createFActionForEachHomogeneous$call1 v4 M" k) |6 ]1 }5 o( O( @- ^
(heatbugList,, d2 C3 W, [) `7 c# R+ ~
new FCallImpl (this, proto, sel," j& M: D E; \8 G4 ?' C" H6 _
new FArgumentsImpl (this, sel)));
# g; q' d# _3 x } catch (Exception e) {) K. C/ k2 B8 W) W Z
e.printStackTrace (System.err);
! o4 f6 N1 ?' p2 x1 r* B! I, j8 i }
`$ m Y& G/ ]' t# S ! n4 K# E$ |( E, u+ j3 J$ G' `- K, v" \
syncUpdateOrder ();7 q8 t3 d1 }7 K# }
6 d& C( x8 P& k% W6 w1 F
try {
" i; Q" Z- z& m) f; x2 i; f+ T modelActions.createActionTo$message
; x- Z% Y }4 @7 L# F, X5 S$ J (heat, new Selector (heat.getClass (), "updateLattice", false));
+ @; `9 B' g! W; m3 w7 @4 P } catch (Exception e) {
2 }3 |" [" u) m ?1 E0 a" c System.err.println("Exception updateLattice: " + e.getMessage ());# [) v1 m( W) g+ ~$ W
}* D5 W! i1 p1 L3 E6 ?; o% g, p
$ Q! y% F2 y8 q7 L5 {; T' V3 @
// Then we create a schedule that executes the
8 T% [" C2 l# m$ @) b // modelActions. modelActions is an ActionGroup, by itself it
# M# K; J% A! j" R% R/ d7 C // has no notion of time. In order to have it executed in, s! k4 U+ q8 ~- F
// time, we create a Schedule that says to use the
8 D) o) o. J# y // modelActions ActionGroup at particular times. This
- r) l( x" n7 Q8 P+ L5 ~0 d9 N // schedule has a repeat interval of 1, it will loop every
, @3 p) P$ m1 v/ V0 n# a0 q // time step. The action is executed at time 0 relative to
, R' C; |: w* D. {- G: E // the beginning of the loop.! J' S" a" G! L6 F8 d: |- Q* `
* I2 F/ |) _# u8 j6 I2 S+ p9 i/ F* R
// This is a simple schedule, with only one action that is N- W- u2 v/ [: G6 A- H6 _9 D
// just repeated every time. See jmousetrap for more
: o3 i. r; c5 v! R- i0 s$ A3 } // complicated schedules.
; c& f; ?9 ~/ Y5 b + d% ]# c/ Q9 u
modelSchedule = new ScheduleImpl (getZone (), 1);( p" _5 T) w, Y! h3 d
modelSchedule.at$createAction (0, modelActions);
; k" h) x, R' m $ _8 f' m# [$ f6 ?: S' X
return this;0 E; W- x) M" M2 Y7 v8 U% t5 ~0 T
} |