HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
. \% A0 v( ]6 k5 s7 h
7 Z( B& g4 X% i( Q5 t7 {: N$ w public Object buildActions () {% V3 Z7 a' J5 G; f2 q
super.buildActions();
* S6 ^- t* _# V ) J) Z! _9 B$ L t1 \$ ?
// Create the list of simulation actions. We put these in
0 Z! A6 b" {4 k; N0 Z, ]8 ~ // an action group, because we want these actions to be- z) h; ?7 g0 c! h, C
// executed in a specific order, but these steps should7 `8 q9 G- [6 S1 w X8 }
// take no (simulated) time. The M(foo) means "The message
7 @& f; z: c0 K, L0 ~4 L1 w5 g // called <foo>". You can send a message To a particular
. y* \- J; S$ I$ l1 _% m) t: t // object, or ForEach object in a collection.+ U' h1 i3 {; C3 d* T1 F
1 a# @1 f' K: F4 ^6 o: y
// Note we update the heatspace in two phases: first run
! g- |' s' K: Y( |% f9 n // diffusion, then run "updateWorld" to actually enact the" j- j3 L$ G! N% n
// changes the heatbugs have made. The ordering here is
/ q$ M2 v% q* t5 N- c$ w. z // significant!/ V7 S. a& A0 X% r' E6 q
4 ~* D! m# s6 e. x5 {0 U! j
// Note also, that with the additional
; G) V( j( ?: C3 _7 e+ n7 g // `randomizeHeatbugUpdateOrder' Boolean flag we can; A [- e" i5 T; M2 F, T
// randomize the order in which the bugs actually run1 M8 `0 I+ P6 L1 Q& r8 k
// their step rule. This has the effect of removing any
m6 A4 s" k6 U9 _; R // systematic bias in the iteration throught the heatbug. `( c y8 @+ U! Y; {
// list from timestep to timestep
9 S8 d3 ^! C3 Y2 q" c
: } \# h9 L6 X, ]2 R4 J+ k // By default, all `createActionForEach' modelActions have7 r4 u# b0 ^5 f B7 R$ b0 t6 q% s
// a default order of `Sequential', which means that the2 C3 s# S: i. g; X
// order of iteration through the `heatbugList' will be) l" Z' s* D& C0 D
// identical (assuming the list order is not changed. f% `5 Z6 k! n
// indirectly by some other process).' D5 _0 F+ t9 o# A7 @4 A
" P- x5 r P5 q& P% p modelActions = new ActionGroupImpl (getZone ());
% V8 d7 J i1 Z$ S- K, ^
3 b" ^) L! u. Q' @7 R try {; e5 a% r( n" j- Q' A
modelActions.createActionTo$message) E# G2 P& v% ]% h$ S7 z
(heat, new Selector (heat.getClass (), "stepRule", false));
9 l9 c5 t7 H4 I0 Y- Z8 f } catch (Exception e) {
, M# h$ h! u6 N+ @2 N' ` System.err.println ("Exception stepRule: " + e.getMessage ());
" q! K* s2 R7 K/ ^# }9 c6 G }: D9 T0 |0 G. q) g S2 t
% P5 M/ K8 Y: z v; z try {% n$ t5 e. @- s, m0 i, p" g
Heatbug proto = (Heatbug) heatbugList.get (0);
9 G8 u0 r2 v1 ^* q) T& h; J+ i Selector sel = & M+ ?5 H, n I+ s
new Selector (proto.getClass (), "heatbugStep", false);
5 E5 ~$ ?6 s l- i. o& } actionForEach =# r f+ |/ e+ A6 t
modelActions.createFActionForEachHomogeneous$call( T- O0 U9 o( {( x. k0 S4 N
(heatbugList,' k" ]' w: x/ p
new FCallImpl (this, proto, sel,% f( @/ j, R e& b& o# w
new FArgumentsImpl (this, sel)));
/ a# s, t/ `3 I; N } catch (Exception e) {
) m+ L7 A: n. ?- t, w6 A e.printStackTrace (System.err);" C$ k2 P5 D+ v N
}
( D. j( r) a& C9 Z) O9 c* _
- h9 s: [! @" O. p) g syncUpdateOrder ();( O! b7 N9 y3 C* [
+ b( g8 G0 U" _; p+ B7 x/ D try {/ d- G$ {% m% a
modelActions.createActionTo$message
* q3 w) K( `. {; f' M7 Y (heat, new Selector (heat.getClass (), "updateLattice", false));8 ?/ }. D7 m$ e2 |. n: `9 R
} catch (Exception e) {
- W+ t$ T# Y% U0 V. _( J& g System.err.println("Exception updateLattice: " + e.getMessage ());- _; G \! J1 M- V8 A
}8 l, ~/ J, Y |7 W$ Q8 Y0 @
1 \: D+ n z8 J( i- K: }8 |
// Then we create a schedule that executes the0 I% D. @) N6 E' Y+ @3 m1 Y0 Z
// modelActions. modelActions is an ActionGroup, by itself it
w7 n- }7 \5 s: m+ j( u // has no notion of time. In order to have it executed in
9 ^4 U" u8 S% P9 L# e // time, we create a Schedule that says to use the
' t0 l& Z9 Z$ W- }" K s0 U, T // modelActions ActionGroup at particular times. This7 ^: i7 q/ t O7 [* \ q
// schedule has a repeat interval of 1, it will loop every
) R5 E$ x8 H4 r/ T( G // time step. The action is executed at time 0 relative to3 M. O; Z; ]! v5 y0 w; ~* k3 v" \
// the beginning of the loop.
0 f/ [; b" ~( H0 B+ p* ]% W7 K+ S1 B/ Y
// This is a simple schedule, with only one action that is
1 f0 S- W, E' p( z5 z // just repeated every time. See jmousetrap for more( e& u9 O- P. d5 U; L# `
// complicated schedules.
O' h% s0 { Z: n0 H- E! Y# P
\9 R+ l( c( b, N0 u modelSchedule = new ScheduleImpl (getZone (), 1);: R9 a# I9 L% z# a9 b; \, k) T
modelSchedule.at$createAction (0, modelActions);
& j. V( {% g- n; v : r, s! m+ U/ z5 C2 C
return this;
6 J& w$ ?- [ I k! R } |