HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
- Z/ l3 ?' t' H, ?+ O9 Y+ Y" N. Z1 ~* |3 \/ N) a
public Object buildActions () {
. ]3 e4 d& ?# T% T3 Y' u super.buildActions();. `! G9 E. Q: `7 _4 B& N- Y! C
4 o( S, P- c8 ^% E
// Create the list of simulation actions. We put these in
" Q# U; V. H7 P8 w+ Z) S7 P; z7 f! ` // an action group, because we want these actions to be
' ]( W k3 A: x# { // executed in a specific order, but these steps should0 L7 _. c% c( S0 @
// take no (simulated) time. The M(foo) means "The message x1 x$ G6 y3 c% }1 d: {
// called <foo>". You can send a message To a particular
/ ~. k" P+ {- k' b/ ? // object, or ForEach object in a collection.$ r; I3 l) E9 l8 r( }3 t! h
4 I6 Z2 y: F+ }1 n+ L
// Note we update the heatspace in two phases: first run4 U( g0 \* Y5 _' E9 L
// diffusion, then run "updateWorld" to actually enact the
5 |6 g! | R3 p9 m& ?- W" R // changes the heatbugs have made. The ordering here is
4 Q; p1 l5 i: k9 i4 G, S3 d+ a1 a // significant!
O% g, z. T; F+ l; L7 _- h
4 m$ M$ @% w( P* y% ~# G6 N // Note also, that with the additional
8 P6 o0 P. \7 o- |) U // `randomizeHeatbugUpdateOrder' Boolean flag we can. Q' Z0 l& P) |* I" X
// randomize the order in which the bugs actually run u, o/ n" h$ ~+ e) E( {
// their step rule. This has the effect of removing any
5 a- Q- p2 S: P7 c- g. h // systematic bias in the iteration throught the heatbug
2 \: B. U* Q9 E1 y // list from timestep to timestep
4 c! C: [2 f Q$ S2 F0 W5 ~$ p % |: W |8 x1 x$ h8 S. }/ Z8 a5 x
// By default, all `createActionForEach' modelActions have/ F. k( ?/ M0 @" F9 u$ S- D+ I5 W
// a default order of `Sequential', which means that the
. b( _ \) @7 Z& k // order of iteration through the `heatbugList' will be
2 s% T7 G% w# F6 ~ Q // identical (assuming the list order is not changed
3 I( [8 R( p* J# d3 E$ U // indirectly by some other process).0 v J. ` C+ n; p+ o ]
6 Z1 K: l7 ?# G( ^
modelActions = new ActionGroupImpl (getZone ());- u+ U4 b4 k! n$ X! I
4 g/ Z7 k. ^# ?
try {6 i2 ?7 y/ U m8 b) o
modelActions.createActionTo$message
6 w9 x' I# _& t2 D: \1 v$ W- z (heat, new Selector (heat.getClass (), "stepRule", false));
, ]' R- I6 V7 X+ o+ R6 H' N } catch (Exception e) {
! k5 r, p. |2 C2 M System.err.println ("Exception stepRule: " + e.getMessage ());
1 ^3 F; B, I" N2 }3 f8 M6 } }/ ^0 y; F6 Y1 e+ m$ k: r, O9 q2 J+ g
* O) W! ]* U2 B: \ z
try {' Z' f8 {2 e3 u$ C: n& F. o
Heatbug proto = (Heatbug) heatbugList.get (0);3 D0 r' q0 p3 f8 e/ w: I
Selector sel = + L, p7 ^0 u1 [# j2 w: Y
new Selector (proto.getClass (), "heatbugStep", false);
$ A5 R1 v/ o, F4 I0 S2 n+ p actionForEach =
7 r8 W# X& {1 Y- Z1 W( k* P modelActions.createFActionForEachHomogeneous$call
6 N- Y3 T i) W2 h9 x (heatbugList,
+ E- {$ K% s+ Z" \, S- ~ new FCallImpl (this, proto, sel,
' s0 L* s" F9 N* ^5 v* r new FArgumentsImpl (this, sel)));
& Q6 }4 l1 H/ _3 x } catch (Exception e) {
2 ^$ k4 u% A( L, n. p7 H0 g6 z e.printStackTrace (System.err);
/ S! N" P5 F, P, v: W5 Q% p3 R }
1 n# x& _0 I$ {3 J6 @7 K
$ f, V6 F" s5 S9 l/ M8 f6 q1 h syncUpdateOrder ();& ` O$ m/ R5 S9 A- `9 z+ ?
. {3 i( L) o1 l) i7 N. g try {
% D9 b. Z/ N- x, V$ C q modelActions.createActionTo$message
1 H, V S+ N' L/ {. ~/ J5 h (heat, new Selector (heat.getClass (), "updateLattice", false));2 K6 p3 W0 A" z# G
} catch (Exception e) {
u; \) X2 V) o/ O+ D9 P' O& ^ System.err.println("Exception updateLattice: " + e.getMessage ());* l5 t- w2 L9 |/ d
}
7 i: ]" i) T5 N
2 C. h' U5 }. V! w: h // Then we create a schedule that executes the1 w3 ~ e' ?2 W' t" x7 Z
// modelActions. modelActions is an ActionGroup, by itself it+ t; z7 k$ W% l( A% ]
// has no notion of time. In order to have it executed in: F" ?- Y2 R' e- q
// time, we create a Schedule that says to use the& ?; k0 _: B. g+ B/ j+ d
// modelActions ActionGroup at particular times. This, c* x9 J3 ?+ J& @& d* T
// schedule has a repeat interval of 1, it will loop every% p7 `9 c' \3 w0 V8 l4 O
// time step. The action is executed at time 0 relative to# U( ~; F& k7 H8 d
// the beginning of the loop.
+ N! m3 ~" L4 A. _0 z# q' |& x# P. ?. d8 a7 g
// This is a simple schedule, with only one action that is, v, [2 [6 a* Y- X3 T6 q
// just repeated every time. See jmousetrap for more
! U7 ~" G) k$ Y: r9 M0 q6 O // complicated schedules.# K3 ?- ]1 P+ O
* @+ | c9 x# o1 y" V1 r modelSchedule = new ScheduleImpl (getZone (), 1);
9 z' h' I# \: ]* d- D modelSchedule.at$createAction (0, modelActions);
2 \( p2 E: q; C0 V) b. p6 f: M+ t
7 ~6 P/ t& M# O) f return this;
9 X! b1 l5 u* u% @! A5 k5 ~$ z } |