HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
! e$ ^) ~3 [" e/ v& E- y( }5 w; v2 A/ b0 C; N: p& f9 p
public Object buildActions () {6 F# p M3 ~0 }( @/ m9 s4 Y
super.buildActions();
* N' i" j3 J) `5 B" _! |1 F
8 ] ~: r$ U3 I& Z // Create the list of simulation actions. We put these in. k Q1 K* C8 I) J' c0 U
// an action group, because we want these actions to be! M, ?. { |: j8 Q9 x6 w
// executed in a specific order, but these steps should
, w) F8 N9 W) v& I" D8 |+ Y // take no (simulated) time. The M(foo) means "The message
6 ^- u) g8 K# h$ ^' I0 C4 t // called <foo>". You can send a message To a particular1 S8 |3 g2 j/ `( V9 ?/ S) q$ q0 ^
// object, or ForEach object in a collection.' I# s3 L: @7 i! k/ ^/ D" v) S
' G& ~, p& O( k7 q" V( m
// Note we update the heatspace in two phases: first run
& y/ W9 Q9 l" V // diffusion, then run "updateWorld" to actually enact the& w& P5 c3 ^% Z! o* j( {+ W1 \5 D
// changes the heatbugs have made. The ordering here is
/ N$ F" m1 v% S$ l // significant!" |4 M- ^$ |/ s _9 a: [ B' h
% @" q6 M6 D: G$ A+ A0 ?- d8 |/ U
// Note also, that with the additional) U2 Y+ F* E; i) o, U, F+ L( h
// `randomizeHeatbugUpdateOrder' Boolean flag we can
; e7 o! k- ]7 ?6 n // randomize the order in which the bugs actually run
. E4 b, u+ {: u3 W6 h- M9 m // their step rule. This has the effect of removing any
" L, a7 p1 }) [6 i // systematic bias in the iteration throught the heatbug
6 j( b% U% F" X, l! x6 R6 \ // list from timestep to timestep
6 @8 N( x3 r4 h( N6 Y: p 9 E$ D4 T8 y) f! B% J2 D
// By default, all `createActionForEach' modelActions have: S R+ i/ G2 D7 |
// a default order of `Sequential', which means that the* x Z2 \) T) h) ?. h* ~- n; U. O
// order of iteration through the `heatbugList' will be
/ o# o1 Q1 @7 x* Z; l6 G$ a // identical (assuming the list order is not changed
; x2 c* ~- @1 @ // indirectly by some other process).' l W; I- v+ J6 r7 d3 s
5 }/ f( ]8 |3 r; P" M7 u% _1 r modelActions = new ActionGroupImpl (getZone ());
# n+ l7 U% k; v$ _4 S) I3 k, t. \
try {
8 @# y/ ^9 M, g6 |- S5 C) Z modelActions.createActionTo$message
1 {/ B9 F k, ^ (heat, new Selector (heat.getClass (), "stepRule", false));
5 |6 Z. A2 c& j } catch (Exception e) {
( `3 t* y0 K% l! a, s; f System.err.println ("Exception stepRule: " + e.getMessage ());2 x% ?7 i0 K3 q' M0 _4 {7 U( \
}
. d4 q7 I0 ?+ L; D; j% u D0 ]( w }: c' h8 v
try {+ L4 p) a( c2 L! k
Heatbug proto = (Heatbug) heatbugList.get (0);' `6 h" e+ q9 Y% v% K
Selector sel = # ~9 J3 |! ^8 \, H7 s+ X
new Selector (proto.getClass (), "heatbugStep", false);$ ^ F% y/ O. ]5 Q- _6 h' S
actionForEach =
6 V- v1 `7 R m. G: \; p modelActions.createFActionForEachHomogeneous$call9 C" c5 K( }* m) b( h
(heatbugList,
: b& _+ ~3 ^1 i+ c new FCallImpl (this, proto, sel,% T0 |" g* s$ p1 w g0 x4 M
new FArgumentsImpl (this, sel)));
/ l( J/ ?, f' B# i- B; z } catch (Exception e) {
% G, g9 s( ^# ] e.printStackTrace (System.err);
/ f4 `. d+ j7 C+ Q }6 V# P) C' |; M3 }% _8 z/ T' V
, g4 Y, R' E' t" ]( r( y# Z
syncUpdateOrder ();
3 d! C* I. |% n3 E& E K L/ x b, ^8 P. |
try {
! ~$ a7 \% c5 G+ T modelActions.createActionTo$message " R9 }$ o8 u, K7 u- F
(heat, new Selector (heat.getClass (), "updateLattice", false));" b& i, b6 L9 C2 e1 O5 [# m1 z
} catch (Exception e) {
3 g4 o5 C* }& [$ s W0 @ System.err.println("Exception updateLattice: " + e.getMessage ());
5 N2 v0 q; e: P( B! m Y }
9 L/ {2 `( c3 C; b& K 4 L Z% K. \1 _; q' Q1 O
// Then we create a schedule that executes the( D1 r8 H, F7 t; c) M- t1 z( y
// modelActions. modelActions is an ActionGroup, by itself it8 E9 L: S: a/ |2 a9 j
// has no notion of time. In order to have it executed in$ c3 t0 w! U5 G2 x
// time, we create a Schedule that says to use the3 P7 t: M$ } I; `1 m1 q" B
// modelActions ActionGroup at particular times. This
8 d5 z5 j1 ^- K1 X* D // schedule has a repeat interval of 1, it will loop every. p w2 Q4 ?- _
// time step. The action is executed at time 0 relative to
3 r/ l* r) N2 j H // the beginning of the loop.
+ Z. `, p1 n, S7 X: N5 t7 h/ p
" T. d5 ]5 L8 I3 C3 L A1 v+ i // This is a simple schedule, with only one action that is& k2 m1 N4 w! a9 q% Z
// just repeated every time. See jmousetrap for more
) |4 K/ z9 a4 U // complicated schedules.) }7 _! f p7 k6 b5 u; \3 o
/ F/ P1 v; W+ E9 H0 J T! _7 b* y/ {1 _ modelSchedule = new ScheduleImpl (getZone (), 1);
+ \; c) |% H3 ^5 v" G modelSchedule.at$createAction (0, modelActions);
% X) r. o W! K& s0 {( z* w) r% t) ^ ' T6 E8 D% d* |- E+ J! O7 e
return this;6 E+ {$ |2 A( ^3 l4 @ H& C$ O0 T7 m
} |