HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
( ^( {& |5 v" q* ~$ B
2 n0 F6 B% H+ b) l public Object buildActions () {
; g/ {8 s! j0 X% Z# p; ` super.buildActions();" i! }. j* u# d8 s
9 t. c4 J$ [7 U! P2 e3 F) P // Create the list of simulation actions. We put these in+ J9 ^* ]1 _+ |( O. R
// an action group, because we want these actions to be* L( n3 M/ N" \( N6 v+ W; z
// executed in a specific order, but these steps should' V0 D3 c$ b9 i7 ?, {! n
// take no (simulated) time. The M(foo) means "The message% g h$ z9 v( L, v5 G6 g9 o, _
// called <foo>". You can send a message To a particular" }0 f) _! c( @3 n; s
// object, or ForEach object in a collection.
& B% {: B( U- Q7 `; i; D' @: u 9 r8 }- D4 Z0 o) f w' h0 L
// Note we update the heatspace in two phases: first run9 v6 d- k( x% }) ^
// diffusion, then run "updateWorld" to actually enact the
& H# r. j6 Q! h7 q, d* F // changes the heatbugs have made. The ordering here is
! G% S% C, `: M+ m; \9 | // significant!
8 b/ v1 A" ^: P, t: Z) |
" {# a# g' _, u7 U // Note also, that with the additional
( x) I' {* R7 }8 \' ] // `randomizeHeatbugUpdateOrder' Boolean flag we can
% U6 @4 K7 c% v/ t/ c // randomize the order in which the bugs actually run
" s. k8 G" x) d7 J" J5 i& A5 S // their step rule. This has the effect of removing any
6 {2 \- V, B7 F2 K7 t, m5 g // systematic bias in the iteration throught the heatbug
" `; ?' f5 b% e( f6 K% \/ @ // list from timestep to timestep
L! C1 `! _. U$ U 2 }" h% Z9 }) ]! l3 v0 Q+ {
// By default, all `createActionForEach' modelActions have
7 @& e# I8 p, g4 S0 h' R // a default order of `Sequential', which means that the
7 L* _6 m8 Q' \; d/ k! o' C // order of iteration through the `heatbugList' will be
# a0 U0 Y/ `" Q0 j5 @4 w9 m // identical (assuming the list order is not changed. u: p, t7 X* ?8 C; p' O( [
// indirectly by some other process).
" h* H6 o1 N% l) I% G( G 4 Z6 A: [' x4 j8 t3 n6 A* R
modelActions = new ActionGroupImpl (getZone ());
5 c, r* W2 g& m3 n, G& E8 p1 q; g- J8 R
try {
) p$ B% n& h+ h* w0 R0 Q9 O+ V modelActions.createActionTo$message
$ x* Q2 z' f+ ]$ ]$ y7 A; E, Z (heat, new Selector (heat.getClass (), "stepRule", false));$ ^5 O. ?9 }: [
} catch (Exception e) {
( u. C* s! S/ T. K9 F System.err.println ("Exception stepRule: " + e.getMessage ());
5 x1 z$ H5 w0 f. ~ }) n. W% A. _7 x% v
+ E& S6 a0 E+ k9 l try {; A" i- q% C" k& c! y8 A/ j" T
Heatbug proto = (Heatbug) heatbugList.get (0);
- F) Q2 W% b% w6 e% p- b: l Selector sel = 5 S0 P% E: E# S* C2 U E, q# _% I
new Selector (proto.getClass (), "heatbugStep", false);
( c2 e# J* [" V7 P6 m actionForEach =- Y+ }% J# Z5 N' G, k f
modelActions.createFActionForEachHomogeneous$call; \' M' P2 q, r/ V6 m' S+ p8 ~% \
(heatbugList,
( |0 {$ C( m, Q! @8 C new FCallImpl (this, proto, sel,9 w8 t5 s& r7 v T$ u
new FArgumentsImpl (this, sel)));
_) ]" c- {3 V# L2 @7 j. i+ T } catch (Exception e) { L; D8 ?8 N% l3 d
e.printStackTrace (System.err);
' e2 n% F$ r" g0 o* f7 C, Q1 i }
' t# o6 D; V7 [4 `& c1 M 3 k" Y8 g4 k1 U. \
syncUpdateOrder ();
- M# E3 f* w. h: \, x
9 C g+ P, v/ Y& u. E9 Z try {
" B B2 K" [* J) ]/ j. ^ modelActions.createActionTo$message
9 H6 Q! I( M! E/ ^ (heat, new Selector (heat.getClass (), "updateLattice", false));/ D, [) O4 m) K; t* ?6 p/ ]
} catch (Exception e) {
" U3 Q1 d* O2 ~0 o6 K3 ~ System.err.println("Exception updateLattice: " + e.getMessage ());2 d% H# ~5 }$ K3 J0 F; P& N; W4 ]
}. G9 q/ c* Q# N8 ]
+ L, W8 P3 \( l
// Then we create a schedule that executes the
. F/ j. C+ \* S( [ // modelActions. modelActions is an ActionGroup, by itself it( {3 v. c. I8 D1 j! b# g, r4 l2 O
// has no notion of time. In order to have it executed in
# H! [5 c7 b0 q3 q: _ // time, we create a Schedule that says to use the$ ]; [: i, d& R
// modelActions ActionGroup at particular times. This! W$ Y* G4 x9 P
// schedule has a repeat interval of 1, it will loop every5 ~9 `$ Y; X: @' l! s( r
// time step. The action is executed at time 0 relative to2 ^% D. x$ W. X) c) u! f
// the beginning of the loop.4 y$ p% l: W2 ~+ \, o
9 y# J% _) t) l( X* ?
// This is a simple schedule, with only one action that is" x/ \/ ~0 J* t/ c
// just repeated every time. See jmousetrap for more3 Q: z: C: l: i/ C9 F* p, p
// complicated schedules.
0 }3 C' ~ @ i7 u8 A$ m2 t * O) y5 s8 U( e. M
modelSchedule = new ScheduleImpl (getZone (), 1);
- a3 N4 \7 v1 u: A( c2 M modelSchedule.at$createAction (0, modelActions);; n( \" }1 ?. t" h
0 k, b3 G h& V/ J% [ return this;
, `: H. x! i/ F5 m, w% {* ?2 z- L } |