HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
. `1 P+ f `: L5 q( ?4 G& k* b6 W7 ]( S9 P7 L
public Object buildActions () {
. p! O3 f' q* a f0 \$ g- N- i( h$ O super.buildActions();& r0 M9 i8 y$ `2 t* B
' \% P/ c: t' @3 N. d // Create the list of simulation actions. We put these in; t9 n6 `5 i) e% r; c0 p# i1 M7 U
// an action group, because we want these actions to be
- K* ]. X8 u9 w8 P3 @( t+ \7 G // executed in a specific order, but these steps should9 b8 l, n( v0 ^0 y% J& G
// take no (simulated) time. The M(foo) means "The message/ W: b7 W9 C5 N! K
// called <foo>". You can send a message To a particular8 i8 ]8 P5 g" O" b6 I8 T; e
// object, or ForEach object in a collection.
' H0 a$ o. r. a& A2 v% s3 _ / P- C7 j. p9 I. H6 E5 n8 }7 O0 @
// Note we update the heatspace in two phases: first run
- G9 j, D! U: s- L: ^4 u // diffusion, then run "updateWorld" to actually enact the! P. B1 C8 e u% {
// changes the heatbugs have made. The ordering here is
) E: J, x4 I5 o- Z% O/ q // significant!
' l4 q+ a, `7 n0 S1 p1 f
; c+ ]; y/ P8 E // Note also, that with the additional1 r X2 U( V. M. W
// `randomizeHeatbugUpdateOrder' Boolean flag we can% ]- m( p" \& [: Z% C, Q
// randomize the order in which the bugs actually run( w6 u8 m3 g7 m4 d. J% N+ h
// their step rule. This has the effect of removing any" x0 e: R0 B# f$ ~. V
// systematic bias in the iteration throught the heatbug( R. u! m) f( U- ~5 O, O
// list from timestep to timestep
: z* c0 w. _# J, C
, v1 F2 Q; d, R6 F) ^; b1 D // By default, all `createActionForEach' modelActions have
; i( y, _1 o% m& t U5 E M // a default order of `Sequential', which means that the: j$ ]/ e; c( T! V( r
// order of iteration through the `heatbugList' will be
) A, @* t1 C9 O5 t) N- e // identical (assuming the list order is not changed
# F$ u2 C; O! H# }: T6 b" v8 N // indirectly by some other process).
8 U5 z/ e$ |( V$ b X: r @0 ?8 |
modelActions = new ActionGroupImpl (getZone ());
/ M) \9 Q5 H7 G' u/ K; [: N {& K) ]& ~' J3 I" y; ^3 l- ~! P
try {- M/ a: w- G; V( H! }
modelActions.createActionTo$message& N% H1 w ?5 d
(heat, new Selector (heat.getClass (), "stepRule", false));
; C) o; o/ @* p8 |- l } catch (Exception e) {
. z, t' R- F8 m2 X3 ] System.err.println ("Exception stepRule: " + e.getMessage ());3 p& e& V6 g' ?) B3 a
}7 Q8 n, \1 |* E' G+ U3 }
) c0 O, g6 h, M1 [) e8 U; x3 M try {. P: n3 ?& e; E
Heatbug proto = (Heatbug) heatbugList.get (0);% x' ~- ]' ?. A* E- g- ?+ q
Selector sel = & E J$ @/ _' \) h9 Z# \9 o; n4 ?# s
new Selector (proto.getClass (), "heatbugStep", false);
+ u9 }* e0 ]+ J, N f6 U actionForEach =
1 n& Q1 h+ w/ [( Y" S modelActions.createFActionForEachHomogeneous$call
' ?- M v8 Z- I/ y; ]# T! l# O* [ (heatbugList,
6 r- O X5 s7 B1 d new FCallImpl (this, proto, sel,
5 N+ T% j4 s1 s! s2 G new FArgumentsImpl (this, sel)));
W* Z7 H% B. v& J } catch (Exception e) { E3 P' J0 p( J6 Y0 a; b
e.printStackTrace (System.err);2 U& N. z" x3 O' H2 \, K2 C9 P/ t: @; M
}
! W+ N( Y: V/ j/ w1 \& X: {
. y' Z- z% x, X+ N0 W syncUpdateOrder ();
9 F. s# l# Q- K3 P
4 c" i$ F- {, \ try {! _" a2 c8 t: S! l
modelActions.createActionTo$message 1 N' d7 f% Y7 F# G
(heat, new Selector (heat.getClass (), "updateLattice", false));: \" |2 `4 b p1 ]% q5 Z1 C
} catch (Exception e) {
! i7 P- x$ v7 N: z, J System.err.println("Exception updateLattice: " + e.getMessage ());
4 Y, u0 s* u& D, c: H8 o0 k2 Y } k' U5 z! s+ Q, u
7 a# ?) I( n& o! U6 g // Then we create a schedule that executes the
- o* V1 M% f2 X: D' P, E" i7 ^5 [2 {+ v // modelActions. modelActions is an ActionGroup, by itself it
' Y8 w1 r1 \/ J: ? // has no notion of time. In order to have it executed in! l0 j5 n* O5 ^, R( R, l
// time, we create a Schedule that says to use the
! j' t! S; O, J. t. k. ]) R // modelActions ActionGroup at particular times. This
. T a! b2 m+ B7 F% g {! U* F // schedule has a repeat interval of 1, it will loop every
1 F" [5 M' c& a4 U% B // time step. The action is executed at time 0 relative to
7 N, h: k; `$ {( @7 [8 M# W // the beginning of the loop.
: x) j/ n. a# m# i3 |! V, I$ G5 a1 m, E% G0 t ^# `+ D
// This is a simple schedule, with only one action that is) Z, d+ i) `& J6 b& C! g6 L& U( i% ]
// just repeated every time. See jmousetrap for more; [' k8 W# h& W0 C4 M8 [& n1 f' U
// complicated schedules.
5 b; D0 c1 m8 z# G* z- K$ b' s
6 G& W- p/ \# M4 B modelSchedule = new ScheduleImpl (getZone (), 1);
3 X$ \2 U8 T5 I) ^8 \5 f modelSchedule.at$createAction (0, modelActions);) {0 N- f! b" h8 W
2 t' q, I7 q" I+ C: ~+ t4 Y return this;
: S& t4 k2 w ]$ V } |