HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:) k: j: J1 A% V! s& T
& C H9 H8 t# [+ k% Q* g public Object buildActions () {
9 h3 k# f5 `' G! ]/ y- G super.buildActions();
9 U. J7 X q! Q4 h: j+ k" | ' h! h3 L$ q& z3 n
// Create the list of simulation actions. We put these in
& k$ i4 a L7 w4 w6 x' q! Y! d // an action group, because we want these actions to be
) p) R( n L1 T$ z6 P# Q5 e5 } // executed in a specific order, but these steps should
T! F/ ?2 E4 K- i; R ?4 j // take no (simulated) time. The M(foo) means "The message/ e3 K' T; J* \3 w; O& ]% \# a
// called <foo>". You can send a message To a particular
4 f& Y; P8 a6 q // object, or ForEach object in a collection.
5 ~+ T/ B& ]( G6 ^5 X6 R
. r8 T0 }) f+ }; Z // Note we update the heatspace in two phases: first run
7 Y* B; a2 D5 K3 p' w; ` // diffusion, then run "updateWorld" to actually enact the
* J3 x, G: H2 d' e$ M // changes the heatbugs have made. The ordering here is
' T1 k, U; I# i6 Z! h // significant!
& T$ N* B2 b: { X, Z2 q9 f+ A0 O 4 u& g' U& u+ P6 _2 `+ d8 j
// Note also, that with the additional
: m0 A3 r2 M! G% p0 a+ p // `randomizeHeatbugUpdateOrder' Boolean flag we can! J4 o- @4 x* o2 J; e
// randomize the order in which the bugs actually run3 v/ F, x7 T4 ]5 u: {/ y
// their step rule. This has the effect of removing any
# o+ R- { n7 j j // systematic bias in the iteration throught the heatbug
7 J$ @& q$ B- i1 d // list from timestep to timestep
: ]/ h+ ]* z1 d! d# C
c* O7 H) @0 \$ g; L // By default, all `createActionForEach' modelActions have
/ d' j' k9 {5 l7 T! M! D( u: F) ~ // a default order of `Sequential', which means that the! W$ c/ [3 E8 {/ I
// order of iteration through the `heatbugList' will be5 N) y! H: C4 ]+ H( d% F: ^$ G
// identical (assuming the list order is not changed* U0 S$ T5 V' a, M, G
// indirectly by some other process).7 D7 V1 K5 r. w5 |$ `1 k3 [
. u8 h# s; T" @
modelActions = new ActionGroupImpl (getZone ());! R1 [( @* Y+ \* J+ V% @
; [6 }4 R5 w/ W1 ]! s' g; s* r
try {- {' T/ T2 @, {
modelActions.createActionTo$message2 P+ j" f# _* s2 i
(heat, new Selector (heat.getClass (), "stepRule", false));9 U7 k+ M+ |, d7 r+ P) y/ p& @
} catch (Exception e) {* ~. V) ^, n' c1 u e0 V
System.err.println ("Exception stepRule: " + e.getMessage ());9 o7 l9 h1 B( {6 \& S1 y
}
' I: n/ W! u8 o6 o6 Q$ b1 R# j% f
: @' E7 U$ V7 D# y try {, D) J2 m" k6 W: f
Heatbug proto = (Heatbug) heatbugList.get (0);; n7 K$ \+ ?' y# X+ w6 a3 _9 E" I
Selector sel = 2 v9 v6 U ^3 M* ~
new Selector (proto.getClass (), "heatbugStep", false);5 A( h# c" N. {! i8 m
actionForEach =
8 L1 ~, F1 Z( _0 I' `9 _8 D modelActions.createFActionForEachHomogeneous$call3 N: \6 ]9 z7 t' p
(heatbugList,
1 S P( [" ?. I3 u% G! Q; U, L new FCallImpl (this, proto, sel,
6 R S9 y# Y% X2 _1 i* m new FArgumentsImpl (this, sel)));4 V" `+ ^6 C5 \' F' Z
} catch (Exception e) {
9 A9 I' i* j2 i. D5 B* H e.printStackTrace (System.err);
4 p! p9 g, O* r1 X* F* X }
; J2 d" p" ]! K% P' t) b/ O8 ] ' ~+ j H7 ]1 Z O
syncUpdateOrder ();
1 e6 z! m- F, z8 X4 S }1 r C# s2 S/ H1 }6 R: L: I
try {
; s. j" M. a2 ~' b9 b4 Y; X modelActions.createActionTo$message 3 J7 `3 ~6 T/ j! D, p# a8 u
(heat, new Selector (heat.getClass (), "updateLattice", false));
! m5 A6 |+ [# R. R: Y } catch (Exception e) {5 \3 c# v& }, S4 `. [' q! i
System.err.println("Exception updateLattice: " + e.getMessage ());! e8 s- z, ^4 S, |# u0 I
}: E' k: C4 c& x2 V
6 U) y6 Q: y7 _( C
// Then we create a schedule that executes the
% \: W; R' Z% { E0 _5 ? // modelActions. modelActions is an ActionGroup, by itself it5 L: A, p8 M- m- R4 F% C/ `5 o, @
// has no notion of time. In order to have it executed in
$ H' [* ?" @3 n$ Y- M // time, we create a Schedule that says to use the
: R& G2 a! M. q' o7 L; ` e // modelActions ActionGroup at particular times. This
- Z& D# ~( ^9 Z- I: t // schedule has a repeat interval of 1, it will loop every
! r) e; i& Z; g: x( `3 k" ? // time step. The action is executed at time 0 relative to
( ~- r- h6 p, g$ M% F // the beginning of the loop.
% H( h3 I3 B) b3 u- ~
4 H2 I' K5 c' {# Z // This is a simple schedule, with only one action that is! O0 \% y: j2 j- u2 R1 m! H
// just repeated every time. See jmousetrap for more, J, t) Q3 A* T
// complicated schedules.* E: P& t; a3 L! N6 l" u
$ R h+ Q1 T, R W) Z9 f3 H
modelSchedule = new ScheduleImpl (getZone (), 1);
. \0 m3 b4 @' p$ N6 J" C modelSchedule.at$createAction (0, modelActions);) @( h6 H% r. x4 h
+ v& Y7 k! Y/ E x
return this;
* c6 G! X( S3 m7 O' o/ p } |