HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
5 w. N9 U9 e+ v6 [% G2 k2 {! N7 U5 j* S8 M s. l8 K% c$ N
public Object buildActions () {2 J: F( ~3 Y0 i( \5 K
super.buildActions();+ w+ F) |1 [7 M- o* T! [: z
# r" V" I) |2 x7 [& q8 B // Create the list of simulation actions. We put these in
6 A& V$ M; ]2 k( s! {( R // an action group, because we want these actions to be2 O1 f7 q e4 P+ {9 d' d
// executed in a specific order, but these steps should
- L+ p5 y! R! r- b% m // take no (simulated) time. The M(foo) means "The message) t/ m- V _, m9 u# L3 \; a6 D
// called <foo>". You can send a message To a particular" p7 E Q' a1 B& d# h4 ~
// object, or ForEach object in a collection.
( G0 K n3 X4 S# ] " g# R; D" {# s9 q$ H/ U( L# g+ {
// Note we update the heatspace in two phases: first run
0 L: n" H+ \: l6 a# T# z // diffusion, then run "updateWorld" to actually enact the6 p- G5 O, T& W( j
// changes the heatbugs have made. The ordering here is
9 @4 J- \" p4 y6 C // significant!
: H1 t$ \0 z7 B7 b0 X% B! u3 N , L% h) A8 Z& N) F; s S5 g( j
// Note also, that with the additional: q- I3 A5 J9 c6 \" j# K( |
// `randomizeHeatbugUpdateOrder' Boolean flag we can
: @3 D. |! h+ Q" h5 ` T // randomize the order in which the bugs actually run
+ L- X3 m3 H6 c' E$ a5 _ // their step rule. This has the effect of removing any
" \+ k( @5 K: b" a' A // systematic bias in the iteration throught the heatbug
9 ]/ `- W0 s8 f8 z // list from timestep to timestep
! d2 }# J' l5 W s. |
) a7 n+ T v- l% a' d+ I // By default, all `createActionForEach' modelActions have
" Y3 z5 n) z! p- P# q* o! v$ G // a default order of `Sequential', which means that the
1 z7 p7 M- I& f // order of iteration through the `heatbugList' will be; A3 h/ d& q# c
// identical (assuming the list order is not changed
1 M, j5 D8 O. {* y/ I // indirectly by some other process).
. A3 q! I9 Z$ m. `% V4 p
: ]* y# x+ k0 N7 v" v+ H0 ~6 c modelActions = new ActionGroupImpl (getZone ());! T* f, `3 u( Y) Y) J0 o" F
* f- H6 I: |% @5 P try {1 M5 [& Y" b' G6 c6 Z+ b: h5 ^$ _
modelActions.createActionTo$message
2 E# }: o1 z+ h+ r+ V3 k (heat, new Selector (heat.getClass (), "stepRule", false));
C# O6 q4 n6 N, e6 k$ J" }$ I } catch (Exception e) {
$ }. v) ]* s1 K+ z/ f System.err.println ("Exception stepRule: " + e.getMessage ());
1 I& D( t2 w/ W. x2 |4 E8 u( o }. Y8 ~& T. B3 L
; d3 k3 [$ l; ^" {, m try {
3 F) [# m1 v4 C5 m; p$ e Heatbug proto = (Heatbug) heatbugList.get (0);
8 C' L+ \' { O( l r( L6 ` Selector sel =
& [5 u6 e) Y' f7 @; ~4 r new Selector (proto.getClass (), "heatbugStep", false);' u0 s% i% G0 h7 g7 d
actionForEach =5 F' F+ B: z6 x! Z7 M9 N! s9 C* H
modelActions.createFActionForEachHomogeneous$call+ j; _4 _. f3 T' }" @& E" }
(heatbugList,
" q0 A; D9 [5 }7 n: e2 c1 ]" f new FCallImpl (this, proto, sel,
6 v0 \% {2 g* T Z1 B new FArgumentsImpl (this, sel)));
7 V2 z% [& i% h3 f+ u0 A } catch (Exception e) {
2 } @- s' J% \! V. W& ] e.printStackTrace (System.err);& H6 e9 Q5 N/ A w0 r4 A
}
! W: S; S2 t$ S: A . s2 i1 ?, u, j+ ]8 B
syncUpdateOrder (); D+ o7 c! h2 m2 n
" H* p8 |( J/ l* {% y try {
7 B' f7 u. G8 l. m; J4 x modelActions.createActionTo$message \, [6 E& } }- Q l! s9 L
(heat, new Selector (heat.getClass (), "updateLattice", false));
8 o" t2 g7 b5 `$ h) F4 Q6 n9 r } catch (Exception e) {# i, y4 i7 _0 g; w/ N% D" S( C: K
System.err.println("Exception updateLattice: " + e.getMessage ());7 q% j( V6 k: t# B8 s
}
/ T; u) B' i" p5 ` % I+ D1 ~6 i9 e+ v2 |5 B
// Then we create a schedule that executes the. d) e3 t) w( d/ x4 `
// modelActions. modelActions is an ActionGroup, by itself it c# T0 R& @+ u4 M }7 @; K
// has no notion of time. In order to have it executed in
, A3 T( q8 j' {8 W7 ]& w // time, we create a Schedule that says to use the
% V2 t) p! b) H2 I: C6 A9 n // modelActions ActionGroup at particular times. This) O2 ^, h$ g# s- O, h) ]& U+ o. S
// schedule has a repeat interval of 1, it will loop every
# ^9 Z% b4 W9 |4 R // time step. The action is executed at time 0 relative to
- t9 K+ n4 [# N1 P, ?% h7 T$ I! K // the beginning of the loop.
$ Z! E8 l# a8 _6 r9 }" t+ y8 v* w: t; ?' c& z
// This is a simple schedule, with only one action that is2 V5 t0 V2 a% K7 D9 j9 s6 ~
// just repeated every time. See jmousetrap for more! r, l) j1 B8 ^8 F7 F$ t/ m
// complicated schedules.9 ^ \' o9 |9 n
+ K: }; J( Q) K. U/ n1 N" |: x# { modelSchedule = new ScheduleImpl (getZone (), 1);
# d1 Y! Y4 i, | modelSchedule.at$createAction (0, modelActions);1 J5 l* s7 g4 z: ?% I% ]
8 T" l0 a2 @: w$ _/ x; P% _ j return this;
5 L( k3 U+ C% ]8 X1 _' V; m' P } |