HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:7 @4 n" W z7 S! s& ]+ E" V0 Z% A, Z
/ g% {. M( [! H; m public Object buildActions () {
- R$ N5 B( x& x; ~0 C" Z super.buildActions();" F* G9 A9 a. x" Y$ D/ [5 F
* Q! Q9 o2 `1 L* d- s/ r! b // Create the list of simulation actions. We put these in2 t6 x( J6 z! M+ e
// an action group, because we want these actions to be. q2 F h) w M6 w/ W& `) _
// executed in a specific order, but these steps should
, p4 s5 j3 M, z0 _7 | // take no (simulated) time. The M(foo) means "The message7 ^5 _5 k. M4 A9 H+ \
// called <foo>". You can send a message To a particular
4 w; M& R+ ?" _" n0 C: x // object, or ForEach object in a collection.
8 x4 l0 x! e1 E% |, L6 x& v5 ~
" a7 B3 J! K" r // Note we update the heatspace in two phases: first run u2 F; ^. c/ d2 S. C, h. ?- s
// diffusion, then run "updateWorld" to actually enact the# O1 q: i) S: w! d3 {* g# y: I
// changes the heatbugs have made. The ordering here is9 F* q4 f2 E- X' Y% @( @! Z
// significant!8 F/ e* S8 s/ A. g$ R3 q0 ]: V+ \& M# \: L
* L. A2 ?( M! K: H
// Note also, that with the additional K: g& ?4 a& V/ h: M; I1 }* v
// `randomizeHeatbugUpdateOrder' Boolean flag we can+ K. ~# D- `( `7 L }5 i* d
// randomize the order in which the bugs actually run0 a$ `- _5 R d8 V3 E7 }$ B
// their step rule. This has the effect of removing any# p5 q- o1 n, f, \- {
// systematic bias in the iteration throught the heatbug* [0 c) @( I8 w& B
// list from timestep to timestep7 z1 S& i$ G. |4 E& s
, w; V# F U% d* a9 s
// By default, all `createActionForEach' modelActions have
4 P+ k% d: Y3 A& j // a default order of `Sequential', which means that the
2 u5 C9 u" p. ] l {7 y* Q3 V! S/ f // order of iteration through the `heatbugList' will be
. D' m! t0 k+ G5 l // identical (assuming the list order is not changed: U3 L" n! j# A% e/ p
// indirectly by some other process).
* J1 K- a% G- m( _9 e+ I& V ' W* @* r; S% v6 _
modelActions = new ActionGroupImpl (getZone ());
. e$ O9 t3 Q; @1 @, z. ?" x
. k2 A% t! [- S7 R1 M4 F* e& C try {
& E; G! z( n+ g+ q modelActions.createActionTo$message
& |+ P" Y0 _0 ~& i! F1 @3 Y (heat, new Selector (heat.getClass (), "stepRule", false));4 V& L2 K6 M1 F6 z1 U$ S; ?
} catch (Exception e) {
' F6 u l0 e7 z$ a) Y+ g System.err.println ("Exception stepRule: " + e.getMessage ());7 O6 T" c" \# Y) H8 O* w* M
}
$ c9 L: x8 L* m; {; K7 O0 T3 H+ n' \& v
try {* j5 y6 N- l6 x( E
Heatbug proto = (Heatbug) heatbugList.get (0);
1 D. V$ E+ }8 n1 M) `+ q! J Selector sel = 5 K% F- t; S `2 B- x
new Selector (proto.getClass (), "heatbugStep", false);
) a6 c3 D% {! {" Q3 ] a, E actionForEach =
, H! p+ U; \* F modelActions.createFActionForEachHomogeneous$call6 k O% R6 _) T/ p: i5 \& \, o2 E5 m+ X
(heatbugList,3 A; Y8 |+ C" B m0 m8 q2 q" T
new FCallImpl (this, proto, sel,9 {% g0 I" |) `
new FArgumentsImpl (this, sel)));4 M) o9 }+ i2 R+ }6 f1 W
} catch (Exception e) {- l p% e/ S" ~9 [
e.printStackTrace (System.err);# P" a! ~9 `2 }9 X7 B$ `" N" k
}
/ z' e- |0 k$ y7 w( u. L , ~9 u' E5 w$ C# k, A# k
syncUpdateOrder ();
: O% e( T: D" ]9 j* v/ k) g7 F
$ Y9 p3 g0 x8 M* g7 i try {& H. P- B; A% z
modelActions.createActionTo$message
8 Q2 ?2 P& b: p" L5 u# g. d (heat, new Selector (heat.getClass (), "updateLattice", false));% T* u0 y+ w6 e; U+ @
} catch (Exception e) {' I% Q7 m( G7 x) {6 P2 j" [
System.err.println("Exception updateLattice: " + e.getMessage ());! c1 j( [* i+ `
}
/ j! R, J2 h% k& R* c
$ Q1 ~# q8 k* V' f% J7 ? // Then we create a schedule that executes the
0 n& g U7 L- N4 W1 g) S" g2 n // modelActions. modelActions is an ActionGroup, by itself it
$ }; Q! Z: H8 ~6 C7 r2 a: a // has no notion of time. In order to have it executed in
% o) K- \7 f. x Y! t, d2 t // time, we create a Schedule that says to use the
. z- x4 ~0 G8 w4 _. G5 O* k: f9 p // modelActions ActionGroup at particular times. This, ~" p1 c! X# l
// schedule has a repeat interval of 1, it will loop every
+ f1 P4 h1 v; H6 S6 \' W) p // time step. The action is executed at time 0 relative to
4 Y% x, d+ j3 c7 _6 b // the beginning of the loop.
* p/ o4 @. z* u3 T/ V6 }4 T+ I* o! M
// This is a simple schedule, with only one action that is7 i8 d! Z& S! E) ?
// just repeated every time. See jmousetrap for more; w3 `% K( v( o2 I% p* T% m
// complicated schedules./ y$ } A* ?. p; E/ w
+ z4 X+ c8 Q; r2 V modelSchedule = new ScheduleImpl (getZone (), 1);
) I3 |1 S6 o& |# ^! o! ?$ \. I modelSchedule.at$createAction (0, modelActions);
0 O& X* h, v6 ^7 I! o! L
0 n5 |, f5 V& y- Q return this;+ D$ A+ U; P7 [6 M, i
} |