HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
* E' G% [% P. t& l- N# m; ?. x2 s+ ?/ `# q
public Object buildActions () {$ ~' V. t; e H. M9 y1 s" c; k9 H
super.buildActions();
, _9 X7 d+ L7 o5 X* P- i" b / n1 C; j* T" _4 ` S" ]
// Create the list of simulation actions. We put these in0 ?5 L3 K1 x, x E: U% M7 c- g
// an action group, because we want these actions to be
: U% o6 O% y/ f, @5 T) U // executed in a specific order, but these steps should
+ O! z# Q [# T7 n7 e+ \ // take no (simulated) time. The M(foo) means "The message& W- t4 a% w7 B
// called <foo>". You can send a message To a particular0 l/ c4 v. f1 R7 P! y9 r* j# r; a
// object, or ForEach object in a collection.3 s/ D# X# s: Q# u1 ]
% ?( U. F" ^% X4 b // Note we update the heatspace in two phases: first run
- @: o3 d8 Y, y- t // diffusion, then run "updateWorld" to actually enact the
$ c- K4 Q+ M; o3 S // changes the heatbugs have made. The ordering here is
. y% B! ~: e0 F+ I2 L! T5 f& G* L // significant!
& I, x2 \7 y2 X7 x/ o9 K9 W$ _" B
: L( y; P0 ]( \4 o/ m // Note also, that with the additional
7 ^. G: x5 |+ |9 w+ j // `randomizeHeatbugUpdateOrder' Boolean flag we can+ V6 j* A/ a9 n( Z( a0 r
// randomize the order in which the bugs actually run4 c. E) Z, l, V3 T |" U
// their step rule. This has the effect of removing any2 e, I$ I$ E# u. g
// systematic bias in the iteration throught the heatbug( i! J8 P7 z: S- q% @* f: J
// list from timestep to timestep' {0 B3 m5 [/ d8 x9 d* f8 H9 b
0 W9 C' P z. S4 l# ? // By default, all `createActionForEach' modelActions have
" |4 M$ N& U2 m( a4 J" o // a default order of `Sequential', which means that the
6 v A$ P$ O6 y$ D b // order of iteration through the `heatbugList' will be
8 q# s ^3 @$ o* K. _, G0 q // identical (assuming the list order is not changed
+ ~. |: C; @- h' M // indirectly by some other process).
$ n* Y# p2 F& K& c: _
@, g& h: ? n5 q% X) a+ B modelActions = new ActionGroupImpl (getZone ());
& P" f/ g4 F* b& a$ O; _( K
9 _) s1 ]4 C% e% h try {
/ Y& o* H, V% s) P/ L) K modelActions.createActionTo$message6 t( O( L2 d# ], P2 u# q4 n
(heat, new Selector (heat.getClass (), "stepRule", false));3 v- f, n3 p3 i, u" U
} catch (Exception e) {
& I( I5 L W: A# O System.err.println ("Exception stepRule: " + e.getMessage ());2 i( `! Y7 p. z: `- }
}
( ^5 z% c- b) [4 w
) {2 {9 j. z, Y9 t, E+ L* f try {5 r# A8 m; t" S; r* K1 T$ w# w
Heatbug proto = (Heatbug) heatbugList.get (0);% B! m- s& v! g6 t
Selector sel = : a" q5 N5 ~! S( k0 A7 m
new Selector (proto.getClass (), "heatbugStep", false);
( O5 `9 Q5 I( D6 o) [& h actionForEach =
5 A5 v6 ?$ X# |$ z4 z3 w modelActions.createFActionForEachHomogeneous$call
% J. ]# W0 g- K$ _, t (heatbugList,( J! E6 J. t! V4 |3 k2 ~& J* l9 @
new FCallImpl (this, proto, sel,
2 ~0 V4 x, a4 i new FArgumentsImpl (this, sel)));: G' i. g/ @1 b9 m: M
} catch (Exception e) {
% Z4 } t" Y& i/ f' k9 p7 L8 }& \ e.printStackTrace (System.err);2 w! O7 t: \! m% Z
}' F0 h" s% T' a# s( g
9 N8 w* F: G7 f. _' J5 a5 [
syncUpdateOrder ();
. @ {5 j9 q0 u( U( q3 _% E: O0 {5 Q: D! ]
try {+ R h; S" t: _7 M9 T
modelActions.createActionTo$message
6 n0 S1 g9 c) u! X! V (heat, new Selector (heat.getClass (), "updateLattice", false));
) B1 c. B( [+ Z } catch (Exception e) {
/ a/ B; l: U! f1 r( t3 u System.err.println("Exception updateLattice: " + e.getMessage ());% D# b7 r6 q) r/ N6 i B% o1 }
}9 N3 W& G' v6 p. N( b) P
* g3 m8 {6 U7 {) N i" T8 n1 ^8 G // Then we create a schedule that executes the+ P! d: ]4 |, N0 o8 K
// modelActions. modelActions is an ActionGroup, by itself it
/ I7 K0 p+ [ a }, J# R$ @9 x% v9 q: x // has no notion of time. In order to have it executed in( [. d) H4 v6 h) }
// time, we create a Schedule that says to use the. W. ^1 |' K+ Q9 b0 i8 u% D
// modelActions ActionGroup at particular times. This
- `7 c# t& j* D" J) \ // schedule has a repeat interval of 1, it will loop every
/ Z/ r7 x; R3 }& F" C* v( w' k // time step. The action is executed at time 0 relative to3 t9 W3 `1 @4 r, z
// the beginning of the loop.
8 s. O0 y) C$ s" [! [: U/ [7 H. E. u/ l! }% d* Z" E- X
// This is a simple schedule, with only one action that is+ L, c8 R0 z/ s. r6 V3 z1 N3 O6 u5 A- y
// just repeated every time. See jmousetrap for more8 U; Z7 Y# m3 I7 K8 d( ^
// complicated schedules.
! u2 I. O) G% t" O# U; b# ]' M
6 g6 E0 ~! f& ~9 z9 Q modelSchedule = new ScheduleImpl (getZone (), 1);
0 y b; C2 `" Z5 L modelSchedule.at$createAction (0, modelActions);! B' ^% F- n6 A& H' F9 p9 G! C# |4 {
' |5 ?* s4 h! Q; ?- |4 m return this;
( k- d8 C' G8 @2 @ } |