HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:* X* E. G$ d2 [
" e" F: Y' U- O# j# } z public Object buildActions () {
% ^/ X1 ]+ y- a( X" A* }3 F super.buildActions();
2 O' n+ V8 E9 V/ J- H Y9 y; M4 D 8 e" O H( V. E* t4 C
// Create the list of simulation actions. We put these in
! D* Q. Z4 O" d3 t/ A) o' ` // an action group, because we want these actions to be
; l( I$ j9 ~5 _ S5 J' t // executed in a specific order, but these steps should% z A& G* B! o& A: q4 v
// take no (simulated) time. The M(foo) means "The message
; x+ D% d$ _2 x- _) m K5 V* ]: q // called <foo>". You can send a message To a particular
2 h) r8 b7 w) h/ f/ T2 j& R // object, or ForEach object in a collection.$ p# \; U' z% k* w( h& V, W
' p$ b4 J$ i( B1 s- b3 K
// Note we update the heatspace in two phases: first run
2 D; \+ @; [! o# t( t, R+ S1 A, r // diffusion, then run "updateWorld" to actually enact the
y+ @! j! T7 F6 s' W5 X // changes the heatbugs have made. The ordering here is$ Y( D/ R& o- \) b
// significant!+ g5 c# H5 x2 W" z$ _5 J, p/ P
+ q/ F1 h* k; z# t3 a // Note also, that with the additional5 b: n3 _1 N* ]9 q6 L7 c! |+ E) p
// `randomizeHeatbugUpdateOrder' Boolean flag we can2 {& q) A- e, M; [( @6 m9 q2 d
// randomize the order in which the bugs actually run, D2 h- o4 D6 O! X0 @
// their step rule. This has the effect of removing any
- Z9 E) r R- l- Q/ g0 j; d% V. X // systematic bias in the iteration throught the heatbug
% t9 B. O- i+ f" f0 [6 q% K: v // list from timestep to timestep
, H" G, U1 \8 ~7 Q4 n* B
5 {# D% b% j+ h. G // By default, all `createActionForEach' modelActions have
; x' k7 }/ X: [+ j! x! r1 _' w // a default order of `Sequential', which means that the G* H9 J) x' Y/ c- S: [
// order of iteration through the `heatbugList' will be& R+ S- T1 H ^/ c. u
// identical (assuming the list order is not changed; _ y/ L: D7 j1 ^
// indirectly by some other process).
^/ ]" A4 u+ F! L. f- c+ K9 Q: c
4 ^, I6 v6 [+ S6 V4 M6 p modelActions = new ActionGroupImpl (getZone ());- ^2 W3 |4 m8 m; b
8 }/ ]+ | M5 X# Q
try {
7 G7 c& B4 G0 [6 H& V% ?& ^( t! l modelActions.createActionTo$message. @& @3 y* D7 ^0 N9 \& R L
(heat, new Selector (heat.getClass (), "stepRule", false));
% Y7 p$ t p. T: v) b# B } catch (Exception e) {
4 ~$ H/ g! ~8 }4 {, d! F4 Y! J, ^" e System.err.println ("Exception stepRule: " + e.getMessage ());
; T- ?) L5 E' T/ ]! k }7 a9 }6 y! P$ S
" p3 N* K' k2 A9 y4 H& n8 o, O try {6 j7 j4 g# G& c$ G
Heatbug proto = (Heatbug) heatbugList.get (0);
/ ]# u. {7 T* h0 j8 c2 A Selector sel =
! ]0 T1 L3 Z8 m* P new Selector (proto.getClass (), "heatbugStep", false);7 ~. \* [8 s( `4 F
actionForEach =3 G6 A: G' y3 u1 Z4 v
modelActions.createFActionForEachHomogeneous$call* p" L4 c# z5 [0 i0 |* _
(heatbugList,
: H+ j7 h) ^4 x; h' H5 X+ ` new FCallImpl (this, proto, sel,4 ?1 H& K# q( G8 b t% s( b
new FArgumentsImpl (this, sel)));
6 W' S: U3 u3 Q G4 W& {" r } catch (Exception e) {
W, X& @: ?* v e.printStackTrace (System.err);! w7 k% D; S$ b3 M5 J
}
3 H8 V! N0 X f . ]! ^1 k ^* G, k) e
syncUpdateOrder (); E5 [, r! b5 N3 y: H
* b* Q' f k; b1 S' U7 x try {
" S+ I* @5 V8 E; p" E/ l" I" \ modelActions.createActionTo$message 7 W( J+ F7 F4 }
(heat, new Selector (heat.getClass (), "updateLattice", false));/ E- n* h: T1 d& ~' x" t4 F
} catch (Exception e) {/ R& U3 E' Z% A! I" K/ U% }2 }
System.err.println("Exception updateLattice: " + e.getMessage ());- g& o( ^$ V1 w
}* p5 ?, S8 r {/ @: w5 r3 F* H
. O/ x% ~8 l+ f( m& r9 u
// Then we create a schedule that executes the- N C* @* m$ G3 Q* j
// modelActions. modelActions is an ActionGroup, by itself it7 l( A8 l! X) f
// has no notion of time. In order to have it executed in
& z0 _; Z( i3 a/ _ // time, we create a Schedule that says to use the
2 h/ W0 U& D/ f3 P2 p" F; w8 F% C: H // modelActions ActionGroup at particular times. This
# z1 q0 k7 [/ j: d4 E- a // schedule has a repeat interval of 1, it will loop every
# K( n3 B! l6 t% `! u // time step. The action is executed at time 0 relative to
! w8 c! P- `1 k# ]2 @2 Z) N+ l& l // the beginning of the loop.4 R6 ?: {) k; T: v
/ g9 C3 g; Y; ^# X5 w // This is a simple schedule, with only one action that is
& C- x0 y/ G4 C6 Z! r; r7 J. ` // just repeated every time. See jmousetrap for more- C# o5 n+ C6 R3 [2 Z3 Q
// complicated schedules./ p, V0 s' n. D1 Q: y! G, z [# i
7 @+ r- j i6 `- W modelSchedule = new ScheduleImpl (getZone (), 1);, k& ^! X" R. M' C* P
modelSchedule.at$createAction (0, modelActions);
1 g* I: m0 B* h7 h 3 E/ `+ d9 i2 b5 o1 c3 O$ L) Q3 a
return this;( ?2 L; u$ s6 i/ N4 n
} |