HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
" K: l, n0 m' T/ ]! B. [4 x" i$ u3 x! P
public Object buildActions () {
% K; O N' ?4 `7 U' M super.buildActions();
h/ |) o: h! U0 R# ]- C4 z
8 M: p- D) n* i2 p1 I4 j) X // Create the list of simulation actions. We put these in
# o4 b3 w# s4 a( n" _ // an action group, because we want these actions to be7 Y7 p: A. E1 w9 ? I, p% r' Q
// executed in a specific order, but these steps should
$ Z$ A n5 n; H8 }* T2 E // take no (simulated) time. The M(foo) means "The message' ?/ U) l: X! ~9 i) b; r0 r& |0 F% r
// called <foo>". You can send a message To a particular
8 }3 ?+ ]- V$ J // object, or ForEach object in a collection.9 }' q, f5 z( N% R; h4 r: @
0 X- X0 O& t9 `/ U4 m( B6 ^ // Note we update the heatspace in two phases: first run* i! n3 f' ~6 A. A W8 \ K
// diffusion, then run "updateWorld" to actually enact the/ Q: |. h- ^+ |6 `( [9 q( ~5 c& a
// changes the heatbugs have made. The ordering here is9 _# C8 z+ |4 t( i
// significant!
: M( [. d, [4 Y, l0 Y4 w2 ^ S
$ @/ L& w* k" _5 G2 O // Note also, that with the additional6 e, r" W; }% Y. x# H0 T
// `randomizeHeatbugUpdateOrder' Boolean flag we can
. ^ p8 m, C* |5 L9 H; C // randomize the order in which the bugs actually run- M- p: l/ h+ M2 e3 ?2 B
// their step rule. This has the effect of removing any$ {- ]0 c+ ?" C; ^- o* s3 L: Q
// systematic bias in the iteration throught the heatbug3 d% C& G w1 g" d+ o6 y/ w
// list from timestep to timestep3 n8 k7 z' F% @6 f( I* E
- B; Z9 D `( e+ L9 M' ~/ o7 R
// By default, all `createActionForEach' modelActions have
9 o# b/ l6 R) o" C2 u% ^ // a default order of `Sequential', which means that the
( i L. B+ }" h' L9 k( N# B // order of iteration through the `heatbugList' will be7 O. B* }& b8 |% X8 H" T
// identical (assuming the list order is not changed9 E. L. x+ A2 ?
// indirectly by some other process).; G! D8 n% P( M% S
* g% T) Q: E# g$ O2 \4 n; R modelActions = new ActionGroupImpl (getZone ());: S0 M1 D& Z$ f1 |9 U
( g; [5 F( B% `3 U# H! C9 Q" \ try {- k- ~3 B8 p1 `9 o5 `, p
modelActions.createActionTo$message6 ?# Z* T& i9 H+ @
(heat, new Selector (heat.getClass (), "stepRule", false));
$ l/ @. ^: Z1 C0 P# E* @! c } catch (Exception e) {) o) I6 t; O# n( U9 V
System.err.println ("Exception stepRule: " + e.getMessage ()); V0 p: {5 i, x$ i0 H4 j6 q
}
9 `8 B: h% B8 L: r5 W( n7 v- L: _4 [. l0 o1 C- W
try {
3 M0 W* [/ a9 W4 m$ ? Heatbug proto = (Heatbug) heatbugList.get (0);! H- T6 `5 ~9 t' X8 F! m+ L
Selector sel = 8 h, n1 q8 q0 L; J
new Selector (proto.getClass (), "heatbugStep", false);+ Q! U3 k3 {, D' C8 w0 c
actionForEach =
. E9 `8 j& [- y, o P! U( F& G2 p modelActions.createFActionForEachHomogeneous$call( _% `; c2 S4 F& c
(heatbugList,
; q# T; w! f' S. k0 ]4 t new FCallImpl (this, proto, sel,
$ O, _; M0 M1 b9 m! z0 }: U new FArgumentsImpl (this, sel)));$ ^; P$ z; p- c8 s0 ~
} catch (Exception e) {
) K0 q: m$ a5 T, L2 j e.printStackTrace (System.err);5 B: F( G* }* l$ \5 k1 T& v
}% K9 [3 Y' o1 P- @
+ t7 H1 x, L" |! }8 M0 i& _/ |
syncUpdateOrder ();8 a, z) b4 s$ a$ T' l/ F: [8 W* e& O
. k$ }0 g3 ]5 i5 w: k. Z try {$ e3 I' d! G9 J
modelActions.createActionTo$message
- l5 ~) _& I) l (heat, new Selector (heat.getClass (), "updateLattice", false));
0 K0 U/ A2 e: \7 ]$ F/ a' Q, f; z } catch (Exception e) {
' _! `, M3 l( [# O4 @% b( E8 K System.err.println("Exception updateLattice: " + e.getMessage ());2 D9 Z, Q; G3 ], S
}$ @8 r% z) j3 J. ^& g
3 ~) f/ t2 u1 p // Then we create a schedule that executes the' b& W4 A& Z+ W5 _2 M! l
// modelActions. modelActions is an ActionGroup, by itself it
' Z0 V2 K( y5 Z( S" F // has no notion of time. In order to have it executed in
~ T, g. k/ E // time, we create a Schedule that says to use the$ D+ B: Y9 a( a( R1 N' T% k! Q
// modelActions ActionGroup at particular times. This$ d- x6 E$ u/ q! r1 l. N0 R
// schedule has a repeat interval of 1, it will loop every
/ Z: v5 u2 g; K // time step. The action is executed at time 0 relative to2 X3 c0 s V3 q7 n
// the beginning of the loop.
# @- b. |/ X' o& o$ |8 g
7 i% R6 G' ~+ \+ ? // This is a simple schedule, with only one action that is \7 N9 S9 c6 Z, N; R+ Q
// just repeated every time. See jmousetrap for more
" f9 f" x( Y) O& C5 b // complicated schedules.
3 z/ k+ U1 R. S8 [1 Z7 ? x" ^* r) u) e" f6 L! g
modelSchedule = new ScheduleImpl (getZone (), 1);6 m" z. B' B6 {6 C
modelSchedule.at$createAction (0, modelActions);4 h4 p) s& h% E" T8 ^% f7 g: e! H
% p$ I0 q0 B, d
return this;
$ `2 c" f; A9 R5 c, G+ p! J G ~ } |