HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:+ o) R5 K2 R. {& x+ f8 F/ d. r: w
# Q' v0 T4 m+ {/ J0 ]5 Y* G public Object buildActions () {
$ F$ G# o, m: q, ], r J super.buildActions();5 h9 `% P; a. y( |2 R
, H, A" j) `! D0 d/ z$ d$ n9 {# L
// Create the list of simulation actions. We put these in
; R C8 n q' I6 X8 H // an action group, because we want these actions to be
( t0 ]. P: g3 E* g3 M // executed in a specific order, but these steps should
/ w/ g& ^6 E V/ K- B/ A A( U // take no (simulated) time. The M(foo) means "The message+ H& B/ `2 A0 }; Z7 r. c
// called <foo>". You can send a message To a particular
/ W1 K8 R( t; A2 x$ H- \# X; p // object, or ForEach object in a collection.
+ ^- n5 ?9 l4 Y. _1 l( ~ 2 ^7 [% U9 m$ X! m4 P
// Note we update the heatspace in two phases: first run7 `2 J$ Q. Z2 n' k9 }8 Y: H( K
// diffusion, then run "updateWorld" to actually enact the4 k1 |2 q2 ?, h
// changes the heatbugs have made. The ordering here is* Q# _, t9 R! x0 P+ O. p# D
// significant!! B! h2 q! t* O
# x% q" ?* V8 _: V0 @% K% L
// Note also, that with the additional# D% \. O8 C% u# a. q3 I
// `randomizeHeatbugUpdateOrder' Boolean flag we can
: z& ^# V$ W5 U8 m // randomize the order in which the bugs actually run
G6 U9 s* L& Z, g- k // their step rule. This has the effect of removing any2 L, \8 ?' E1 N3 W; T2 g/ ~$ {
// systematic bias in the iteration throught the heatbug/ X- s, h3 n: p8 L0 f
// list from timestep to timestep
* B ~; F3 w) d* N+ I
" q; X I( v% j+ J // By default, all `createActionForEach' modelActions have
0 j$ C2 \$ l; i6 S // a default order of `Sequential', which means that the
! i7 r) C7 n. B# {+ `5 ]' ^ // order of iteration through the `heatbugList' will be
' N w' {% h6 x; J7 Y // identical (assuming the list order is not changed
2 f9 v, x- k0 H) g // indirectly by some other process).. [' Q. z- H9 F+ ]- I
9 b- f {. |( e$ ^/ y3 k3 L3 U modelActions = new ActionGroupImpl (getZone ());
! J3 Y: t7 P/ A. i1 Y$ R( F3 z. q% w7 M1 ]% E; P T% d4 K
try {8 a! V: ~0 \% ^; c- j0 o
modelActions.createActionTo$message
. J8 c2 z" P/ ]/ e (heat, new Selector (heat.getClass (), "stepRule", false));& z* m; d5 k, d3 f8 K: Z) `
} catch (Exception e) {
0 d2 X, C4 c Z+ o# m1 i5 g System.err.println ("Exception stepRule: " + e.getMessage ());
5 G# o# x: M( V$ f }
* L# Y' N( }. R l" y1 s, |) r3 H# e
try {& N& D' N2 W0 I- z
Heatbug proto = (Heatbug) heatbugList.get (0);
) M% E+ Z5 V4 r0 _$ h, w# G Selector sel = 0 v9 z% N( G. g$ `; b! U
new Selector (proto.getClass (), "heatbugStep", false);4 Q) ?" m4 N! D% l, @
actionForEach =3 q2 ]. m7 [6 M G- ?6 `/ [" P
modelActions.createFActionForEachHomogeneous$call
5 l7 L+ n; m# D: `6 z! v (heatbugList," H- t0 o0 F+ f
new FCallImpl (this, proto, sel,
, K4 r" U, M! P; i$ I: d new FArgumentsImpl (this, sel)));
3 ^, }1 Q1 K4 u' ^3 N4 l8 O } catch (Exception e) {
( _8 T/ m7 e7 P+ A( x5 x% [ e.printStackTrace (System.err);8 w7 d5 a, ?0 P
}& ~! V2 `" C6 i+ N9 N/ D
, a/ z4 x; Z8 ]6 W5 } syncUpdateOrder ();! x! P. b# v3 {: X) Q. f
1 v" N) m; D# v' e# A% K try {
& u3 v, E, E/ G; C0 h modelActions.createActionTo$message
) s* G Z" x" b4 \7 Q8 ] (heat, new Selector (heat.getClass (), "updateLattice", false));1 k i Y/ @" u) k% E Y' O
} catch (Exception e) {* b+ K( t0 E. z1 I' W$ p/ a
System.err.println("Exception updateLattice: " + e.getMessage ());
: p/ ~; J8 b0 E7 }% j" z }6 U5 p* p( k) a& V$ H$ @. T* ^
* N# t( Z! w" R( Z- d5 I
// Then we create a schedule that executes the
% j( v! G/ ^1 Z: i // modelActions. modelActions is an ActionGroup, by itself it: O/ i' m! B2 `
// has no notion of time. In order to have it executed in1 o; s2 s3 ^ Z2 k
// time, we create a Schedule that says to use the
6 \+ w2 L! p) Q! J- K, u8 Z // modelActions ActionGroup at particular times. This Q4 V' S. c9 ^& d3 a# ^
// schedule has a repeat interval of 1, it will loop every
0 m! ?1 C! | S6 n4 R // time step. The action is executed at time 0 relative to5 r% ?$ f2 M+ p$ z7 |1 Z: y3 u+ G
// the beginning of the loop.
1 w1 M$ {, j# T& X0 o$ |- L6 b5 X# v/ {' G
// This is a simple schedule, with only one action that is9 I9 i5 t) {' ^4 G# v
// just repeated every time. See jmousetrap for more, c: W% u: M& v Y
// complicated schedules.
7 ]" S/ A9 A7 c' U 0 \" b2 ^0 O: f# s. a8 ]
modelSchedule = new ScheduleImpl (getZone (), 1);0 e" Z" A% `7 `: W, M9 z7 N
modelSchedule.at$createAction (0, modelActions);0 P9 ~& @ a, @+ n* J$ g. g
1 F; V8 Z! }7 E3 Z return this; M; q# E: O: s! k
} |