HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
9 n ~8 M5 d- W6 u; d/ C1 }1 O* h% ]/ u) r+ j% f
public Object buildActions () {: E& f* i3 m) e0 i8 h5 P% H( k5 h
super.buildActions();
7 k6 s( t* Q9 r1 i9 }! G: F ' M! G. ]# ?2 i- g) f# c
// Create the list of simulation actions. We put these in
5 u; `' P6 S' y" b // an action group, because we want these actions to be
' }" r, c" w6 E8 ~ // executed in a specific order, but these steps should
# l7 U2 l1 x5 E+ R9 Y4 f // take no (simulated) time. The M(foo) means "The message
; A$ d4 Y: k4 G; p: i8 L // called <foo>". You can send a message To a particular
- q+ G. J. z* s4 l' F8 `) h V // object, or ForEach object in a collection.5 ^% a# L* _3 _" g& ~
. ~# Y( b; x/ V. t9 N5 G6 d# ] // Note we update the heatspace in two phases: first run
) z+ ]6 F% m* Y3 @8 T1 ^0 t // diffusion, then run "updateWorld" to actually enact the, V% W0 O! i# m$ I9 U( z
// changes the heatbugs have made. The ordering here is
- _# B6 m, W! }: B4 [# _0 M // significant!* O! Q: ~: @- u9 E3 p7 H7 a. U
* \8 ^( q- F5 N3 |$ c // Note also, that with the additional% G/ q7 I6 r6 g. t/ r/ s% D
// `randomizeHeatbugUpdateOrder' Boolean flag we can0 g* \/ }& ~( p
// randomize the order in which the bugs actually run
; ^) F. `( P0 K# J: z% _: O // their step rule. This has the effect of removing any
% M3 U, v6 f3 y' k // systematic bias in the iteration throught the heatbug
# j$ J( V% }% S5 K! | // list from timestep to timestep
7 z- w& a: x s1 f
& q# J% o9 p1 X& B( v: N- j // By default, all `createActionForEach' modelActions have
0 Y% X8 v! W. h8 b( ^( ?3 ] // a default order of `Sequential', which means that the2 e0 u J; ]9 b" m7 x* F5 Q
// order of iteration through the `heatbugList' will be
! c- d3 ?! S, T( ]9 O // identical (assuming the list order is not changed
) f# c) X) L) e; Z7 V% v) t% c+ j, X // indirectly by some other process).
5 P6 S( z$ ^! K 2 g4 ]3 p' m% A* i
modelActions = new ActionGroupImpl (getZone ());, g6 \5 {! d6 O2 a1 H
: r( v' ~$ f1 D& p3 Q0 Q# R try {. D, G' L j3 P, E
modelActions.createActionTo$message Z! |- U2 _. H2 R1 r
(heat, new Selector (heat.getClass (), "stepRule", false));
( z ], K2 B/ R: B } catch (Exception e) {5 m1 X; W2 o) d. U6 p; E8 ~1 F
System.err.println ("Exception stepRule: " + e.getMessage ());
3 G1 y& r4 ^6 k( K+ w- L- _7 | }3 H. S" {5 w2 X- @3 W* B3 C, U
- S. a4 T( Y3 m' k
try {& ]1 L! c" a5 D) F$ F
Heatbug proto = (Heatbug) heatbugList.get (0);
2 @" Q+ G8 X3 h/ T( r+ c' e$ W/ u Selector sel = 7 u2 \0 B8 }6 B0 O5 v/ L0 ?: [. V
new Selector (proto.getClass (), "heatbugStep", false);
3 b- K. A" P7 L$ A" H actionForEach =7 {, b% B0 g0 }/ l. w: ~! _
modelActions.createFActionForEachHomogeneous$call- A5 [7 f2 K+ J3 O8 x
(heatbugList,
. Y: H( @8 v/ M2 l8 N) a) Q+ q4 |( { new FCallImpl (this, proto, sel,4 b0 u6 i& B" H8 M
new FArgumentsImpl (this, sel)));& L5 m) ?1 V/ f9 W- z) T
} catch (Exception e) {" e: c* g( j' N) X
e.printStackTrace (System.err);5 Q5 w; _- V( ^4 j/ D6 B* k- d+ R
}; I5 ^# g& M; A% Y2 l
P1 L: g2 ?3 ?" O syncUpdateOrder ();
^" g6 S0 b& P* s( x4 l0 R8 l( J6 Q- m' P3 @% g5 V
try {% j9 w4 ?6 y. x2 e
modelActions.createActionTo$message
# a' H. }' W( Z6 K+ X (heat, new Selector (heat.getClass (), "updateLattice", false));: Y5 Z2 w/ m. z4 w4 o
} catch (Exception e) {. g1 ^" y* \5 h# e/ [" `! h- J
System.err.println("Exception updateLattice: " + e.getMessage ());4 t. ~2 D: q. L+ O# H1 H P5 x
}6 r" V, B0 C. c
/ e$ }4 R5 i8 ^8 m! F f // Then we create a schedule that executes the
6 O# a& l( ^, r; W5 y' E // modelActions. modelActions is an ActionGroup, by itself it
5 Y9 ]. S5 }' b/ i x; d3 i: P // has no notion of time. In order to have it executed in
9 I% G+ t" O% h7 g! I7 D1 F // time, we create a Schedule that says to use the
9 u5 w3 l1 U y // modelActions ActionGroup at particular times. This
; ?9 w( J2 r# a* w8 e- H" ] // schedule has a repeat interval of 1, it will loop every
4 Y. M, M# c% w // time step. The action is executed at time 0 relative to
& p! r) N4 J! D8 R // the beginning of the loop.2 T( o8 ^7 F" `
! [ \% r. e8 m/ |( o // This is a simple schedule, with only one action that is
' G/ m+ u7 X. N% G- } T3 V4 \" i // just repeated every time. See jmousetrap for more' |1 u, `5 z1 C
// complicated schedules.
; G- o; o/ ^0 C 7 r! ?5 R3 s# U q' l
modelSchedule = new ScheduleImpl (getZone (), 1);
: {) R2 w2 E& _ M% q modelSchedule.at$createAction (0, modelActions);
% p Z# `% M" g6 q l2 P3 I 8 t4 c# x8 x: c, K! j
return this;6 _5 l' \* \8 o5 D3 T
} |